gpt4 book ai didi

ember.js - 如何使用 Sinon 测试 Ember.run.later?

转载 作者:行者123 更新时间:2023-12-03 06:37:10 25 4
gpt4 key购买 nike

我有一些设置超时的 Ember 代码:

var MyObject = Ember.Object.extend({
setFooToBarLater: function() {
Ember.run.later(this, 'set', 'foo', 'bar', 500);
}
});

我想用诗乃的假时钟来测试一下。这是我尝试过的:

var clock = sinon.useFakeTimers();
var myObject = MyObject.create();
myObject.setFooToBarLater();
clock.tick(600);
expect(myObject.get('foo')).to.be('bar');

但是expect总是在set之前运行。我还尝试将 clock.tick 包装在运行循环中:

Ember.run(clock, 'tick', 600);

最佳答案

请注意,sinon.useFakeTimers(默认打开)会覆盖 window.Date。一旦你已经有一个预定的 Ember runloop 并且 useFakeTimers() 被打开,这就会成为一个问题。这是因为 Backburner(Ember.js 运行循环实现)setTimeout/核心调度方法/尽力优化调用 window.setTimeout(在 ember.js 中查找 executeAt)

在浏览了 sinon 源代码之后,我制作了以下 mod 让这两个人相处得很好( gist )。它指示 sinon 不要触摸 window.Date 并修补 sinon.test() 以在测试主体之后再等待几个滴答声,从而允许执行计划的计时器和异步代码

sinon._originalUseFakeTimers = sinon.useFakeTimers;
sinon.useFakeTimers = function() {
// make sure we don't override window.Date used in
// Backburner.setTimeout() to optimize window.setTimeout() call numbers
return sinon._originalUseFakeTimers.apply(this, [new Date().getTime(), "setTimeout", "setInterval", "clearTimeout", "clearInterval"]);
};

sinon._originalTest = sinon.test;
sinon.test = function(callback) {
return sinon._originalTest.call(this, function() {
callback.apply(this, arguments);

// wait for further runloops to finish (2s is the mocha timeout)
this.clock.tick(2000);
});
};

关于ember.js - 如何使用 Sinon 测试 Ember.run.later?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21896003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com