开玩笑的单元测试:setTimeout在异步测试中不触发

时间:2018-10-03 18:49:03

标签: 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.

控制台未显示日志消息“超时已触发”。

请有人能解释为什么会失败吗?

1 个答案:

答案 0 :(得分:5)

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

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

它看起来像:

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)
});