javascript - 开 Jest 单元测试: setTimeout not firing in async test

标签 javascript jestjs

我试图了解异步测试在 Jest 中是如何工作的。

我正在尝试做的类似于 Jest 文档中的示例。这工作正常..

function doAsync(c) {
  c(true)
}

test('doAsync calls both callbacks', () => {

  expect.assertions(2);

  function callback1(data) {
    expect(data).toBeTruthy();
  }

  function callback2(data) {
    expect(data).toBeTruthy();
  }

  doAsync(callback1);
  doAsync(callback2);
});

但是我想延迟回调调用,所以我尝试了这个....
 function doAsync(c) {
    setTimeout(() => {
      console.log('timeout fired')
      c(true)
    }, 1000)
  }

但测试失败并显示消息 Expected two assertions to be called but received zero assertion calls. .

日志消息“超时触发”未出现在控制台中。

请有人解释为什么它失败了?

最佳答案

您需要使用 jest 的计时器模拟 https://jestjs.io/docs/en/timer-mocks

首先,您告诉 jest 使用模拟计时器,然后在测试中运行计时器。

它看起来像:

function doAsync(c) {
  setTimeout(() => {
      c(true)
    }, 1000)
}

jest.useFakeTimers()

test('doAsync calls both callbacks', () => {

  expect.assertions(2);

  function callback1(data) {
    expect(data).toBeTruthy();
  }

  function callback2(data) {
    expect(data).toBeTruthy();
  }

  doAsync(callback1);
  doAsync(callback2);

  jest.runAllTimers(); // or jest.advanceTimersByTime(1000)
});

关于javascript - 开 Jest 单元测试: setTimeout not firing in async test,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52633843/

相关文章:

JavaScript 将值添加到多维数组

javascript - 如何在文件更改时重新启动 Node 服务器

vue.js - 如何使用 jest 测试 Vue.js 组件中方法的错误

javascript - 父数组中每个值的 Angular Directive(指令)保持同步

javascript - 如何将 shouldComponentUpdate 与 React Hooks 一起使用?

javascript - 根据选择选项元素将表单重定向到不同的 URL

javascript - 使用 async/await 时 try/catch 中的范围问题

jestjs - 测试react-final-form提交

jestjs - 如何配置 jest 在超过 x 秒时失败

typescript - 将 jest 的 expect.extend() 与 TypeScript 的范围限定为单个测试文件