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

时间:2013-07-03 10:52:15

标签: javascript mocking bdd mocha

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

我基本上要求的功能类似于Jasmine's Mock Clock,它允许您将JavaScript时间推进许多刻度。

1 个答案:

答案 0 :(得分:53)

我发现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;
});