我正在使用mocha,酶来创建反应组分的单元测试。以下是一个示例组件。
Foo.js
class Foo extends React.Component {
customFunction=() => {
}
render() {
return (<div className={this.props.name}/>);
}
}
这是测试文件。
富-Test.js
import React from 'react';
import { expect } from 'chai';
import { shallow, mount, render } from 'enzyme';
import Foo from '../src/Foo';
describe("A suite", function() {
it("contains spec with an expectation", function() {
expect(shallow(<Foo />).contains(<div className="foo" />)).to.equal(true);
});
it("contains spec with an expectation", function() {
expect(shallow(<Foo />).is('.foo')).to.equal(true);
});
});
一切都很好。但是当我们使用酶
时,我不明白如何在Foo.js中对customFunction进行单元测试答案 0 :(得分:27)
这个问题的最佳答案实际上取决于customFunction
实际在做什么......
你可以这样调用这个函数:
wrapper.instance().customFunction('foo', 'bar');
如果它是一个在实例上设置状态的函数,从而影响渲染输出的样子,那么你可能也想调用.update()
wrapper.instance().customFunction('foo', 'bar'); // uses setState internally
wrapper.update(); // updates render tree
// do assertions on the rendered output
答案 1 :(得分:1)
您还可以使用chai插件监视jsx文件中的自定义功能。
// to use this pluggin add this to the top of your testing file
const chai = require("chai"), spies = require("chai-spies");
chai.use(spies);
import Foo from "./<path to component>/Foo.jsx";
describe("Foo", () => {
it("a call to customFunction will not error", () => {
let spy = chai.spy(Foo.prototype, "customFunciton"); // spy
const wrapper = mount(<Foo/>);
wrapper.setProps({bar: "baz"}); // manipulate you component in some way
expect(spy).to.have.been.called.once();
});
});
@leland-richardson是正确的,这取决于您的测试正在做什么。理解这一点将帮助您组合新的方式来操纵组件并进行断言。
另一个测试功能以更新组件状态的示例。
it("function will assert new state", () => {
const wrapper = shallow(<Foo {...props}/>);
wrapper.instance.customFunction(); // call custom function
wrapper.update();
expect(wrapper.state("bar")).to.equal("new-state");
});
Chai-spies还具有少量可链接的吸气剂,这使测试自定义功能更加容易。请参阅docs,以获取更深入的说明。