Jest.js 在setInterval中调用函数时无法监视该函数

pxyaymoc  于 2023-09-28  发布在  Jest
关注(0)|答案(1)|浏览(152)

fetchTokens确实在推进时间时被调用了多次,因为我试图记录输出。
但是对fetchTokens的监视并没有显示它被多次调用。

const tokens = await this.fetchTokens();
setInterval(() => {
    this.fetchTokens();
}, 1000);

const fetchTokens() => {
    console.log('nice')
}

Jest测试:

jest.advanceTimersByTime(60000);
const fetchTokens = jest.spyOn(service, 'fetchTokens');

await service.main();

expect(fetchTokens).toHaveBeenCalledTimes(1);

我可以猜到间谍不能窥探setInterval内部的调用,那么我如何才能实现这一点呢?

xzv2uavs

xzv2uavs1#

只要setInterval依赖于真实的,就应该使用假计时器来正确地模拟内部函数。
假计时器将用一个从假时钟获取时间的实现来替换setInterval()
Reference
比如:

jest.useFakeTimers(); // top level of spec

  it('Should pass', async () => {        
    const fetchTokens = jest.spyOn(service, 'fetchTokens');
    await service.main();

    jest.runOnlyPendingTimers();

    expect(fetchTokens).toHaveBeenCalledTimes(1);

    jest.useRealTimers();
  });
});

相关问题