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

时间:2014-02-25 20:33:22

标签: javascript unit-testing ember.js

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

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

  

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

我在Ember.run中包含了所有带异步副作用的代码,但我仍然得到错误。

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

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

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

我做错了什么?

1 个答案:

答案 0 :(得分:1)

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

  BTW,今天发布了一个旨在取代的图书馆   $ .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 promises在测试时不能与Ember.RSVP.Promise互换(但它们用于触发异步路由操作)。

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

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