如何使用异步路由进行Ember单元测试?

No *_*ses 5 javascript unit-testing ember.js

我正在使用Ember.js异步路由指南中描述的功能.也就是说,我从异步路由的model钩子返回一个promise,以延迟转换到路由,这可以按预期工作.

但是,它打破了我的应用程序单元测试的能力.当我运行我的测试时,我在控制台中收到以下错误:

断言失败:您已打开测试模式,该模式禁用了运行循环的自动运行.您需要在Ember.run中包含任何带有异步副作用的代码

我用异步副作用包装了所有代码Ember.run,但我仍然得到错误.

这是一个带有最小例子的JSFiddle:http://jsfiddle.net/nRHfv/3/

该示例基于Ember入门套件及其附带的测试运行器.它有一个工作的异步索引路由.如果设置testing: falsetrue_config物体(10号线),这将打开测试套件,你应该看到在您的控制台上面的错误.

我的异步路由model挂钩在第38行.我已经尝试了几种包含代码的变体Ember.run.例如,我已经尝试在内部定义promise Ember.run,在里面执行所有异步内容,然后在外面返回promise.我也试过包装then()in 的内容Ember.run,就像我在其他一些答案上看到的那样(例如ember集成测试错误.处理异步副作用).

我究竟做错了什么?

No *_*ses 1

经过更多搜索,我在EmberSherpa的 Ember.js 讨论论坛上找到了关于Guide: Asynchronous side-effects in test 的值得注意的评论

顺便说一句,今天发布了一个库,旨在替换 $.getJSON 并使此过程变得更加容易 https://github.com/instruct/ic-ajax

我尝试了 ic-ajax 库,它成功了!在深入了解它在做什么之后,我应该如何编写异步路由的model钩子:

var promise = new Ember.RSVP.Promise(function (resolve, reject) {
  Ember.$.ajax({
    url: '/echo/json/',
    type: 'POST',
    data: {
      json: '{ "text": "Hello from Ember.js" }',
      delay: 0.25
    },
    dataType: 'json',
    success: function (response, textStatus, jqXHR) {
      Ember.run(null, resolve, response);
    }
  })
});

return promise.then(function (response) {
  return response;
});
Run Code Online (Sandbox Code Playgroud)

我想 jQuery Promise 与测试时不可互换Ember.RSVP.Promise(但它们用于触发异步路由操作)。

这是更新后的 JSFiddle,具有异步路由和测试工作:http://jsfiddle.net/nRHfv/5/

我想我会坚持使用ic-ajax,因为代码更简洁,并且在测试时能够加载静态设备而不是实时 API 端点。