如何模拟Mocha测试中的时间流逝,以便调用setTimeout回调?

akn*_*ds1 36 javascript bdd mocking mocha.js

我需要测试依赖于setTimeout的 JavaScript代码才能执行定期任务.我如何从我的Mocha测试中模拟时间的流逝,以便调用setTimeout回调?

我基本上要求的功能类似于Jasmine的模拟时钟,它允许你将JavaScript时间提前一些.

akn*_*ds1 56

我发现Sinon.JS支持通过sinon.useFakeTimers操作JavaScript时钟,如其Fake Timers文档中所述.这是完美的,因为我已经将Sinon用于嘲弄目的,并且我认为Mocha本身不支持这一点是有意义的,因为它更像是在模拟库的领域.

这是一个使用Mocha/Chai/Sinon的例子:

var clock;
beforeEach(function () {
     clock = sinon.useFakeTimers();
 });

afterEach(function () {
    clock.restore();
});

it("should time out after 500 ms", function() {
    var timedOut = false;
    setTimeout(function () {
        timedOut = true;
    }, 500);

    timedOut.should.be.false;
    clock.tick(510);
    timedOut.should.be.true;
});
Run Code Online (Sandbox Code Playgroud)

  • 进入是一个很好的做法.每当你需要为测试进行设置/拆卸时,在对之前/之后使用都是明智的,这样你就不会忘记其中一个. (6认同)
  • @ R01010010如果你没有clock.restore()在每个以及测试内部的任何东西扔掉,setTimeout和其他基于时间的函数将保持被覆盖.通过使用after之后,您可以确保它们始终恢复为默认值. (2认同)