43

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

我基本上要求类似于Jasmine 的 Mock Clock的功能,它允许您将 JavaScript 时间提前多个滴答声。

4

1 回答 1

64

我发现 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;
});
于 2013-07-03T11:09:55.743 回答