我正在测试一个函数(父级),该函数调用返回承诺的函数(slomo)。我想检查.then()中的代码是否正在执行。
function slomo() {
return new Promise(function (resolve, reject) {
resolve('good')
reject('bad')
})
}
child = jest.fn()
function parent() {
slomo()
.then((result) => {
child()
})
}
// TEST
it('runs child', () => {
parent()
expect(child).toHaveBeenCalledTimes(1)
})
结果是:
Expected mock function to have been called one time, but it was called zero times.
我已经确认通过console.log调用了子功能,但是之后测试已完成。
我尝试通过并在测试中调用done
,但这不能解决问题。
也许上面的代码是反模式,需要重写才能进行测试?
非常感谢您能给我的帮助!
账单
答案 0 :(得分:1)
您正确找到了问题的根本原因,即测试早于异步代码完成,所以test should track async correctly。但是似乎您丢失了承诺b / c,但您没有将其退还,所以:
compareTo()
接下来,您只需添加function parent() {
return slomo() // <<<--- add return
.then((result) => {
child()
})
}
:
done
或只返回承诺:
it('runs child', (done) => { // <<<< --- add done
parent().then(() => {
expect(child).toHaveBeenCalledTimes(1)
done(); // <<<< -- done should be called after all
})
});
希望有帮助。