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

Posted

技术标签:

【中文标题】如何使用异步路由进行 Ember 单元测试?【英文标题】:How to do Ember unit testing with asynchronous routes? 【发布时间】: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)。

我做错了什么?

【问题讨论】:

对于看到此错误的人可能想查看有关 ember 运行循环的视频:youtube.com/watch?v=RLgPBM72LQw 【参考方案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 端点。

【讨论】:

以上是关于如何使用异步路由进行 Ember 单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ember 模型单元测试中检查属性属性类型?

如何对使用 Axios(或其他异步更新)的 Vue 组件进行单元测试?

如何开始用Junit进行单元测试

如何对带有异步的流进行单元测试

如何对 python 异步函数进行单元测试?

如何在单元测试之前等待组件的挂载回调中的异步调用完成?