我试图了解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.
。
控制台未显示日志消息“超时已触发”。
请有人能解释为什么会失败吗?
答案 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)
});