Javascript 未运行Jest+酶API模拟调用测试
我有一个我无法理解的问题,我希望有人能帮我解决 这是我的测试:state.messages是一个空数组,而api.botReply在要运行的函数中被调用0次 state.typing设置为true,因此我知道我运行了该函数Javascript 未运行Jest+酶API模拟调用测试,javascript,reactjs,jestjs,enzyme,Javascript,Reactjs,Jestjs,Enzyme,我有一个我无法理解的问题,我希望有人能帮我解决 这是我的测试:state.messages是一个空数组,而api.botReply在要运行的函数中被调用0次 state.typing设置为true,因此我知道我运行了该函数 test('test to resolve data from botReply', done => { const wrapper = shallow(<Bot />); api.botReply = jest.fn(() =>
test('test to resolve data from botReply', done => {
const wrapper = shallow(<Bot />);
api.botReply = jest.fn(() =>
Promise.resolve(wrapper.setState({ typing: false }))
);
wrapper.instance().sendReply();
setImmediate(() => {
wrapper.update();
console.log(wrapper.state('typing'));
console.log(wrapper.state('messages'));
expect(api.botReply).toHaveBeenCalledTimes(1);
done();
});
});
丢弃承诺链和使用随机延迟会导致类似这样的竞争条件 因为在测试中提供了承诺,所以应该将其链接起来以保持正确的控制流。这不是一个好的做法,指定玩笑间谍作为方法,因为他们不会被清理后。承诺应该通过回复来解决,而不是设定状态 应该是这样的:
test('test to resolve data from botReply', async () => {
const wrapper = shallow(<Bot />);
const promise = Promise.resolve('reply')'
jest.spyOn(api, 'botReply').mockImplementation(() => promise);
wrapper.instance().sendReply();
expect(wrapper.state('typing')).toBe(true);
await promise;
expect(api.botReply).toHaveBeenCalledTimes(1);
expect(wrapper.state('typing')).toBe(false);
});
你想用setImmediate做什么?我试图确保数据已被解析,这是我在谷歌上找到的解决方案,但可能是完全错误的。我不知道这里的答案,但我认为放弃这个非标准、不受良好支持的函数可能是一个好的开始。谢谢你的回复,我觉得这是一件更容易理解的事情,唯一的一件事我不知道在哪里调用我的setState,因为tobevalse将失败,因为现在你不需要在任何地方调用setState。您正在测试的sendReply中已经调用了它。您可以尝试在expectwrapper.state'typing'.toBefalse之前添加wrapper.update,尽管这不是必需的。您可以看到它按原样工作,它也没有帮助,状态仍然是{typing:true,messages:[]}确保您使用的是最新的酶版本。答案包含可行的解决方案。正如您在演示中看到的,它按预期工作。这是针对你的情况的。考虑提供一种方法来复制这个问题。所有的事情都是最新的,但有一些睡眠,我得到它使用你的代码工作,谢谢你的帮助!
test('test to resolve data from botReply', async () => {
const wrapper = shallow(<Bot />);
const promise = Promise.resolve('reply')'
jest.spyOn(api, 'botReply').mockImplementation(() => promise);
wrapper.instance().sendReply();
expect(wrapper.state('typing')).toBe(true);
await promise;
expect(api.botReply).toHaveBeenCalledTimes(1);
expect(wrapper.state('typing')).toBe(false);
});