我需要测试依赖setTimeout的JavaScript代码才能执行定期任务。我如何从我的Mocha测试中模拟时间的流逝,以便调用setTimeout回调?
我基本上要求的功能类似于Jasmine's Mock Clock,它允许您将JavaScript时间推进许多刻度。
答案 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;
});