【问题标题】:How to do Ember unit testing with asynchronous routes?如何使用异步路由进行 Ember 单元测试?
【发布时间】:2014-03-28 08:18:18
【问题描述】:

我正在使用Ember.js Asynchronous Routing 指南中描述的功能。也就是说,我从我的异步路由的model 挂钩返回了一个承诺,以延迟过渡到该路由,这按预期工作。

但是,它破坏了对我的应用进行单元测试的能力。当我运行测试时,控制台中出现以下错误:

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

我已将所有带有异步副作用的代码封装在 Ember.run 中,但我仍然收到错误消息。

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

该示例基于 Ember Starter Kit 及其随附的测试运行器。它有一个有效的异步索引路由。如果您在 _config 对象(第 10 行)中将 testing: false 设置为 true,它将打开测试套件,您应该会在控制台中看到上述错误。

我的异步路由的model 钩子在第38 行。我尝试了几种将代码包装在Ember.run 中的变体。例如,我尝试在Ember.run 之外定义承诺,在内部执行所有异步操作,然后在外部返回承诺。我还尝试将then() 的内容包装在Ember.run 中,就像我在其他一些答案中看到的那样(例如ember integration test error. dealing with asynchronous side-effects)。

我做错了什么?

【问题讨论】:

标签: javascript unit-testing ember.js


【解决方案1】:

经过更多搜索,我在EmberSherpa的Ember.js讨论论坛上找到了this notable commentGuide: Asynchronous side-effects in testing

顺便说一句,今天发布了一个库,旨在取代 $.getJSON 让这个过程更容易https://github.com/instructure/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;
});

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

这是一个更新的 JSFiddle,具有异步路由和测试功能:http://jsfiddle.net/nRHfv/5/

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

【讨论】:

    猜你喜欢
    • 2014-12-06
    • 1970-01-01
    • 2014-12-10
    • 2015-05-20
    • 1970-01-01
    • 2016-03-19
    • 2016-05-16
    • 2013-03-15
    • 2016-09-18
    相关资源
    最近更新 更多