我需要测试依赖于setTimeout的JavaScript代码,以执行定期任务。 我该如何在我的Mocha测试中模拟时间的流逝,以便setTimeout回调被调用?
我基本上是在寻求类似于Jasmine的Mock Clock的功能,它允许您通过多个滴答声来推进JavaScript时间。
我需要测试依赖于setTimeout的JavaScript代码,以执行定期任务。 我该如何在我的Mocha测试中模拟时间的流逝,以便setTimeout回调被调用?
我基本上是在寻求类似于Jasmine的Mock Clock的功能,它允许您通过多个滴答声来推进JavaScript时间。
我发现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;
});