Javascript Jest 测试框架 documentation说我需要在我的回调中添加 done()
来测试异步函数,否则该函数将在测试完成后返回,因此测试将失败。我已将 Jest 添加到我的 package.json 和以下两个文件中:
src.js:
function fetchData(cb) {
setTimeout(cb, 2000, 'peanut butter')
}
module.exports = fetchData
src.test.js:
const fetchData = require('./src')
test('the data is peanut butter', () => {
function callback(data) {
expect(data).toBe('peanut butter')
// no done() method!
}
fetchData(callback);
})
我用上面的代码通过了测试,但我认为我应该得到一个失败的测试,因为我的测试文件中没有 done()
。我的 fetchData()
方法不是异步的吗?
编辑:按照 Nicholas 的回答,我将代码更改为:
src.js:
function fetchData(cb) {
setTimeout(cb, 2000, 'peanut')
}
module.exports = fetchData
src.test.js:
const fetchData = require('./src')
test('the data is peanut butter', () => {
function callback(data) {
expect(data).toBe('peanut butter')
done()
}
fetchData(callback);
})
测试运行器应根据 Jest 文档评估期望/断言并失败(peanut 通过,peanut butter 预期),但仍显示通过测试。
此外,Jest 文档说:
If done() is never called, the test will fail, which is what you want to happen
无论是否在回调中使用 done()
方法,无论是否将正确的 (peanut butter
) 参数传递给回调 (即所有四个变体都通过了)。
最佳答案
如果您不将 done
作为参数传递,测试运行器会认为代码是同步的并且不会等待特殊情况发生 - 在这种情况下调用 done
。
因此,在您的断言/期望有机会运行之前,测试被标记为成功。
关于javascript - 异步函数的行为与我对 Jest 的预期不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47275706/