【问题标题】:Why doesn't Jest.useFakeTimers work in beforeAll blocks?为什么 Jest.useFakeTimers 在 beforeAll 块中不起作用?
【发布时间】:2022-07-23 12:35:22
【问题描述】:

我想在全局范围内模拟超时函数,所以我在 beforeAll 块中添加了对 jest.useFakeTimers 的调用。当我运行测试时,jest.advanceTimersByTime 没有执行预定的代码。我使用间谍来确认模拟确实被调用了。但是我注意到,如果我将 jest.advanceTimersByTime 调用移到测试函数或 beforeEach 块中,它会起作用。

这是一个重现问题的简单示例。

describe('test', () => {

    beforeEach(() => {
        // Only beforeEach block works, NOT beforeAll
        jest.useFakeTimers();
    })

    it('setTimeout calls callback', () => {
        const callback = jest.fn();

        setTimeout(() => {
            callback()
        }, 3000);

        expect(callback).not.toHaveBeenCalled();

        jest.advanceTimersByTime(3000);

        expect(callback).toHaveBeenCalledTimes(1);
    })

})

我在docs 中没有看到任何解释这一点的内容。我正在使用 Jest 26.6.2。

【问题讨论】:

  • 您提供的示例代码为我传递。当我将beforeEach 更改为beforeAll 时,它也通过了。有没有其他方法可以重现这个问题?

标签: javascript typescript jestjs settimeout


【解决方案1】:

也许你可以检查你的笑话设置文件(如setupFilesAfterEnv config)。说,如果我把这些代码放在设置文件中,那么它就会遇到你上面说的问题:

beforeEach(() => {
  // reset to real timers
  jest.useRealTimers();
})

因为作为默认行为,beforeEach 总是在 beforeAll 之后执行,即使它是在 beforeAll 之前定义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 2010-10-15
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多