这是我的函数,它基本上是在一个带有等待步骤的循环中调用一个API,这样我就不会达到速率限制。
import { doAsyncThing } from '../../../somewhere';
export const myAsyncFunc = async () => {
// An array of data
const arrayData = await ['123', '456', '789'];
for (const item of arrayData) {
// Call an API
await doAsyncThing(item);
// Wait for 1 second
await new Promise(resolve => setTimeout(resolve, 1000));
}
};
下面是我的测试代码
jest.mock('../../../somewhere');
jest.useFakeTimers();
test('a test', async () => {
const funcPromise = myAsyncFunc();
jest.runAllTimers();
expect(myAsyncFunc).resolves.toBeUndefined();
expect(doAsyncThing).toBeCalledTimes(2);
expect(setTimeout).toBeCalledTimes(2);
});
然而,这不起作用并产生此结果
expect(jest.fn()).toBeCalledTimes(expected)
Expected number of calls: 2
Received number of calls: 0
25 | expect(myAsyncFunc).resolves.toBeUndefined();
26 |
> 27 | expect(doAsyncThing).toBeCalledTimes(2);
我很确定我不能等待myAsyncFunc
完成,因为jest.useFakeTimers
会导致我手动提前计时器。但是,如果myAsyncFunc
尚未完成,我如何提前计时器?
我对如何测试这个功能有点困惑
3条答案
按热度按时间wh6knrhe1#
在启动计时器之后,等待结果不就行了吗?
dphi5xsq2#
感谢Moa提供类似的问题
我已经设法修复了测试,以便等待promise,但是由于一些非常奇怪的原因,即使
arrayData
中只有3个元素,循环也必须运行5次以下是更新后的测试:
eimct9ow3#
函数
toBeCalledTimes
必须与mock
函数一起使用,而不是真实的的函数!从你的例子中不清楚这个引用来自哪里。你能澄清一下吗?我的猜测是你没有正确地模拟这个函数。