如何将 sinon.useFakeTimers 与 ember 一起使用 - 测试(验收)?

How to use sinon.useFakeTimers with ember-testing (acceptance)?

在 sinon 时钟的帮助下,我在 ember 中成功编写了单元级测试,但验收测试似乎总是一个问题。

例如,在我的路线中,我打算在做某事之前等待 5 秒

export default Ember.Route.extend({
    model: function() {
        setTimeout(Ember.run.bind(this, function() {
            //after the timeout do something like transition to another route
        }), 5000);
    }
});

在 ember 测试中我会做一个简单的访问,断言 currentURL() 是好的,然后做一个 clock.tick(5001) w/ sinon ... 然后断言计时器是完成,某些状态为 set/etc。

我意识到 sinon 和 ember 运行 循环似乎不能一起玩,但我很好奇其他人用什么来测试这样的高级定时器(非单元测试/没有硒或睡眠黑客)。

如果稍后需要 运行,您将如何修改下面的(不正确的)测试以使用 clock.tick?

test("sinon and ember play nice", function(assert) {
    var clock = sinon.useFakeTimers();
    visit("/");
    andThen(function() {
        assert.equal(currentURL(), "/");
    });
    clock.tick(5001);
    andThen(function() {
        assert.equal(currentURL(), "/the-transition-url");
    });
});

我认为在所有情况下 sinon.useFakeTimers() 都会破坏异步和同步助手(在本例中是 andThen())。

我在类似情况下测试过类似的东西:

test("sinon and ember play nice", function(assert) {
  const clock = sinon.useFakeTimers();
  visit('/');
  clock.tick(0); // this for simulating rendering right now
  assert.equal(currentURL(), '/');
  clock.tick(5100);
  assert.equal(currentURL(), '/the-transition-url');
  clock.restore();
});

p.s.: 经过对异步助手的大量测试,看起来 ember-testing 框架上的异步实现是基于通过的时间。作为副作用,在 clock.tick(0);clock.tick(50); 之前不会执行 andThen()

p.s.2:看起来还有另一个关于 Whosebug 的问题 Is there a way to run Ember.Testing acceptance tests with fake timers? 以及最新的 ember(2.9 和 2.10),以及 qunit 的升级,当前代码需要更多调整