我是单元测试的新手,因此遇到了这种情况。 我正在使用JEST和酶-REACT JS
我熟悉调用clicks和onChange事件,但是不确定如何为以下各项设置测试:
updateUser = (e) => {
var tempUser = this.state.user;
switch(e.target.id){
case "firstName":
tempUser.FirstName = e.target.value;
break;
case "lastName":
tempUser.LastName = e.target.value;
break;
case "email":
tempUser.Email = e.target.value;
break;
case "userName":
tempUser.Username = e.target.value;
break;
default:
break;
}
this.setState({
user: tempUser,
})
}
因此,我尝试应用我用来测试updateUser的相同设置-不确定其是否正确。
describe(' Test', () => {
let wrapper;
beforeEach(() => wrapper = shallow(<Component {...baseProps} />));
it('UpdateUser method', () => {
wrapper.instance().updateUser = jest.fn();
wrapper.setState({
user:{
tempUser :{
FirstName: "",
LastName:"",
Email:"",
Username:"",
},
},
}),
wrapper.update();
expect(wrapper.instance().updateUser).toBeDefined();
expect(wrapper.state().user).toEqual({});
})
感谢您的帮助-希望学习如何测试转换用例并通过此测试。
答案 0 :(得分:1)
有一个示例,该示例演示了如何模拟具有浅色渲染https://airbnb.io/enzyme/docs/api/shallow.html#shallow-rendering-api的点击按钮。
如果您使用的是旧状态,请使用回调函数。 请勿更改状态。或者您可以使其更简单。
updateUser = (e) => {
let key;
switch(e.target.id){
case "firstName":
key = "FirstName";
break;
case "lastName":
key = "LastName";
break;
case "email":
key = "Email";
break;
case "userName":
key = "Username";
break;
default:
return null;
}
this.setState({[key]: e.target.value})
}
答案 1 :(得分:1)
在没有实际代码的情况下进行推测是很棘手的(我的意思是render()
方法)。
假设它看起来像(我略过了开关/盒以使其更短)
updateState = ({target: { value, id }}) => {
this.setState({
[id]: value,
});
}
render() {
return (<>
<input value={this.state.email} id="email" onChange={this.updateState} />
<input value={this.state.firstName} id="firstName" onChange={this.updateState} />
<input value={this.state.lastName} id="lastName" onChange={this.updateState} />
<input value={this.state.age} id="age" onChange={this.updateState} />
<div id="raw_output">{JSON.stringify(this.state)}</div>
</>);
}
然后专注于测试render()
的结果就不需要您模拟任何功能了:
function updateFieldById(wrapper, id, value) {
wrapper.find(id).simulate('change', { target: { id, value } });
}
it('updates state after each field changed', () => {
const wrapper = shallow(<Comp />);
// checking start output with default input
expect(wrapper.find('#raw_input').props().children).toMatchSnapshot();
updateFieldById(wrapper, 'email', '_email_mock_');
expect(wrapper.find('#raw_input').props().children).toMatchSnapshot();
updateFieldById(wrapper, 'firstName', '_fn_mock_');
expect(wrapper.find('#raw_input').props().children).toMatchSnapshot();
updateFieldById(wrapper, 'lastName', '_ln_mock_');
expect(wrapper.find('#raw_input').props().children).toMatchSnapshot();
updateFieldById(wrapper, 'age', '999');
expect(wrapper.find('#raw_input').props().children).toMatchSnapshot();
});
可以不用检查toMatchSnapshot()
,而是可以检查任何元素的存在或验证特定的文本值,例如
expect(wrapper.find('#fullName').props().children).toEqual('firstName lastName');
您还可以按领域划分测试用例。