我正在为依赖于websocket库的代码编写一个Jest测试。
websocket库被模拟。我想发送消息,等待异步操作完成,并检查响应。
it('sends a message and gets a response', () => {
processor(ws).sendMessage() // do a bunch of async stuff, call websocket.sendMessage()
setTimeout(() => {
expect(ws.getResponse()).toEqual('all done')
}, 100)
})
不幸的是,因为Jest嘲笑setTimeout, setTimeout失败。如果我运行jest.runAllTimers()
,超时会立即发生,因此无法接收消息。
任何想法如何说服jest取消模拟setTimeout,或一个茉莉花的解决方案?
您可以在测试用例之前添加以下代码。它在Jest v14.1.0中为我工作-
jest.useRealTimers()
您不应该在测试期间等待(使用setTimeout
)。相反,使用waitFor
,它是专门为这个用例设计的。它将继续运行测试,直到通过或达到超时(默认为1秒)。像这样编写测试:
import {waitFor} from '@testing-library/react';
it('sends a message and gets a response', () => {
processor(ws).sendMessage()` // do a bunch of async stuff, call websocket.sendMessage()
waitFor(() => {
expect(ws.getResponse()).toEqual('all done');
});
});
如果超时后expect
仍未通过,则测试失败。如果期望在0.01秒内成功,则测试将不再需要更长时间来继续。