首页 > 解决方案 > 用玩笑进行测试时,setInterval 不起作用

问题描述

我有一门课,我正在尝试运行 Jest 测试。该类(不是测试)在内部使用间隔。我正在尝试使用我在测试中创建的一些方法来测试它,如下所示:

const syncWait = ms => 
    {
        const end = Date.now() + ms;
        while (Date.now() < end) continue;
    };
    let myObj = new MyClass(); //the constructor starts the interval
    syncWait(5500);
    expect(...

但是,似乎没有执行类本身的间隔。我放了一些 console.logs 并看到它确实到达了代码中设置间隔的点,如下所示:

this.intervalId = setInterval(() => this.sendIntervalMessage(), this.timeUntilSendMessages); //time here is 3000

但是,即使在间隔时间过去之后,它也不会执行。这是为什么?

标签: javascriptjestjssetinterval

解决方案


所以出于某种原因,用玩笑检查时间不会像那样工作,你必须模拟时间的流逝。

你这样做:

在测试的第一行,我添加了这一行:

jest.useFakeTimers();

不需要导入笑话对象。它在开玩笑测试中自动可用。这条线意味着我们没有使用实际时间,而是为我们提供了模拟(模拟)时间流逝的选项。

在类的代码中,我有一行调用例如setInterval(action, 3000),在测试中我们将调用:

jest.advanceTimersByTime(3000);

只有这样才会action实际调用间隔的 。


推荐阅读