javascript - Jest 模拟函数被调用,但断言 toBeCalled 返回 false

我是 mocking 一个函数:

jest.mock('utils/downloadData')

在 utils/download data 我创建了一个模拟文件:

export default {
    general: jest.fn(() => {
        console.log('mock fired')
    }),
    csv: jest.fn(() => {
        console.log('mock fired')
    }),
}

这个函数在我正在测试的函数中被调用:

...
const convertToCsv = () => {
        downloadData.csv(CSV.stringify(csvData), fileName)
        onFinish()
    }
...

调试时,我看到在闭包中正确设置了模拟函数,在逐步调试时,我看到代码到达了模拟函数内部并且该控制台记录了消息。然而这个测试失败了:

expect(downloadData.csv).toBeCalledTimes(1)

Jest 在期望中接受 downloadData.csv 所以我相信它看到了模拟函数。

它怎么可能不将其注册为被调用?

回答1

测试的函数涉及异步数据获取,这也被模拟了。但是它的异步特性导致测试在完成运行测试函数之前评估预期的 values 。

有帮助的不仅是使测试函数异步(test('output', async() => {),还包括在评估上方的这一行: await new Promise(process.nextTick) 这允许测试在评估结果之前完成异步位。

相似文章