Reactjs Jest如何基于模拟事件等待调用mock
我有一个这样的测试失败了,因为没有调用mock,问题是mock被调用了,但在测试完成之前Reactjs Jest如何基于模拟事件等待调用mock,reactjs,enzyme,jestjs,Reactjs,Enzyme,Jestjs,我有一个这样的测试失败了,因为没有调用mock,问题是mock被调用了,但在测试完成之前 test('should submit if proper values', () => { const spy = jest.fn().mockReturnValue({ data: { authenticateUser: { id: 123, token: 'lol' } } }); mountedWrapper.
test('should submit if proper values', () => {
const spy = jest.fn().mockReturnValue({
data: {
authenticateUser: {
id: 123,
token: 'lol'
}
}
});
mountedWrapper.setProps({
loginMutation: spy
});
expect(spy).not.toHaveBeenCalled();
email.simulate('change', {
target: { name: 'username', value: 'email@test.com' }
});
password.simulate('change', {
target: { name: 'password', value: 'secret' }
});
form.simulate('submit');
expect(spy).toHaveBeenCalled();
});
但是,如果添加以下setTimeout,则可以通过测试
setTimeout(() => {
expect(spy).toHaveBeenCalled();
}, 0);
然而,我正在寻找一个更好的方法来解决上述问题。有没有没有没有没有setTimeout的解决方案?看起来您正在尝试测试一些异步代码。你读了吗?在
callbacks
部分中,您可以找到:
默认情况下,Jest测试在到达执行结束时完成。这意味着该测试将无法按预期工作:
//不要这样做!
测试('数据是花生酱',()=>{
函数回调(数据){
期望(数据)。托比(“花生酱”);
}
获取数据(回调);
});
问题在于,在调用回调之前,测试将在fetchData完成后立即完成。
有一种替代形式的测试可以解决这个问题。不要将测试放在一个参数为空的函数中,而是使用一个名为done的参数。Jest将在完成测试之前等待,直到调用完done回调
test('数据是花生酱',完成=>{
函数回调(数据){
期望(数据)。托比(“花生酱”);
完成();
}
获取数据(回调);
});
如果从未调用done(),测试将失败,这就是您希望发生的
这是回调的例子,但是你也可以使用,和。你能不能再给我一些代码片段,比如什么是装入的包装器,电子邮件从哪里来等等?对不起,但是你的代码还是有点不懂。在
表单
上模拟提交
时会发生什么情况。loginMutation
是直接调用的,还是在一些操作之后调用的?你能添加一些片段来说明这一点吗?是通过还是误报?我的意思是,如果您在setTimeout
中添加一个expect(true)
,那么它是否仍在传递?