禁用Jest setTimeout模拟



我正在为依赖于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秒内成功,则测试将不再需要更长时间来继续。

相关内容

  • 没有找到相关文章

最新更新