我需要测试依赖于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;
});