我尝试使用酶来模拟复选框上的change事件,并使用chai-enzyme来断言它是否被选中。
这是我的Hello react组件:
import React from 'react';
class Hello extends React.Component {
constructor(props) {
super(props);
this.state = {
checked: false
}
}
render() {
const {checked} = this.state;
return <div>
<input type="checkbox" defaultChecked={checked} onChange={this._toggle.bind(this)}/>
{
checked ? "checked" : "not checked"
}
</div>
}
_toggle() {
const {onToggle} = this.props;
this.setState({checked: !this.state.checked});
onToggle();
}
}
export default Hello;我的测试是:
import React from "react";
import Hello from "../src/hello.jsx";
import chai from "chai";
import {mount} from "enzyme";
import chaiEnzyme from "chai-enzyme";
import jsdomGlobal from "jsdom-global";
import spies from 'chai-spies';
function myAwesomeDebug(wrapper) {
let html = wrapper.html();
console.log(html);
return html
}
jsdomGlobal();
chai.should();
chai.use(spies);
chai.use(chaiEnzyme(myAwesomeDebug));
describe('<Hello />', () => {
it('checks the checkbox', () => {
const onToggle = chai.spy();
const wrapper = mount(<Hello onToggle={onToggle}/>);
var checkbox = wrapper.find('input');
checkbox.should.not.be.checked();
checkbox.simulate('change', {target: {checked: true}});
onToggle.should.have.been.called.once();
console.log(checkbox.get(0).checked);
checkbox.should.be.checked();
});
});当我运行这个测试时,checkbox.get(0).checked是false,并且assertion checkbox.should.be.checked()报告错误:
AssertionError: expected the node in <Hello /> to be checked <input type="checkbox" checked="checked">你可以看到这条消息很奇怪,因为输出中已经有了checked="checked"。
我不确定哪里错了,因为它涉及太多的东西。
您还可以在此处查看演示项目:https://github.com/js-demos/react-enzyme-simulate-checkbox-events-demo,请注意these lines
发布于 2016-12-10 03:02:04
我认为我的解释中的一些细节可能有点错误,但我的理解是:
当你这样做的时候
var checkbox = wrapper.find('input');它在checkbox中保存了对该酶节点的引用,但有时酶树会更新,但checkbox不会。我不知道这是不是因为树中的引用发生了变化,因此checkbox现在是对树的旧版本中节点的引用。
让checkbox成为一个函数似乎能让它对我起作用,因为现在checkbox()的值总是取自最新的树。
var checkbox = () => wrapper.find('input');
checkbox().should.not.be.checked();
checkbox().simulate('change', {target: {checked: true}});
///...发布于 2016-10-24 15:12:39
它不是bug,而是“它按设计工作”。
酶基础使用react测试实用程序与react交互,特别是与模拟api交互。
Simulate实际上并不更新dom,它只是触发附加到组件上的react事件处理程序,可能会使用您传入的附加参数。
根据我在这里得到的答案(https://github.com/facebook/react/issues/4950 ),这是因为更新dom将需要React来重新实现许多浏览器功能,可能仍然会导致不可预见的行为,所以他们决定简单地依靠浏览器进行更新。
实际测试这一点的唯一方法是手动更新dom,然后调用模拟api。
发布于 2020-05-29 15:46:54
下面的解决方案最适合我:
it('should check checkbox handleClick event on Child component under Parent', () => {
const handleClick = jest.fn();
const wrapper = mount(
<Parent onChange={handleClick} {...dependencies}/>,); // dependencies, if any
checked = false;
wrapper.setProps({ checked: false });
const viewChildren = wrapper.find(Children);
const checkbox = viewChildren.find('input[type="checkbox"]').first(); // If you've multiple checkbox nodes and want to select first
checkbox.simulate('change', { target: { checked: true } });
expect(handleClick).toHaveBeenCalled();
});希望这能有所帮助。
https://stackoverflow.com/questions/39892256
复制相似问题