javascript - Emberjs - 如何测试 promise 和其他异步行为?

标签 javascript asynchronous ember.js integration-testing

按照此处的教程和其他线程,我无法在具有异步代码时运行测试。以下是我一直在尝试测试的内容:http://emberjs.jsbin.com/xacurasi/1/edit?html,js,output 以及入门工具包中附带的测试。当使用 ?test 参数打开时,应用程序窗口(编辑:显示实际应用程序的框架,而不是 qunit 测试页面)显示空白页面。

这是我唯一的异步代码:

App.IndexRoute = Ember.Route.extend({
    model: function() {
        var promise;

        Ember.run(function() {
            promise = Em.$.getJSON('http://123.345.456.78/ajax/server.php');
        });

        return promise;
    }
});

我进入控制台时出错:

未捕获错误:断言失败:您已打开测试模式,这会禁用运行循环的自动运行。您需要将任何具有异步副作用的代码包装在 Ember.run

这很令人困惑,因为我确实将我的异步代码包装在 Ember.run(function() {//my code here});

最佳答案

编辑:

那个错误解决了问题。该错误并不意味着对 getJSON 的调用应该在 Ember.run 中,它意味着 getJSON 调用的回调应该是在 Ember.run 中。这是 Ember 运行循环工作方式的一个怪癖。该代码在正常操作中运行良好,但在测试模式下运行不佳。关于它有一个简短的讨论here .您需要做的是提供对 getJSON 函数的回调。像这样的东西应该可以解决它(并使您清楚地知道您在做什么)。

model: function() {
    return new Ember.RSVP.Promise(function(resolve) {
        Ember.$.getJSON('http://foobar', function(data) {
            Ember.run(null, resolve, data);
        });
    });
}

或者您可以使用我链接到的线程底部的小型库。但我想我会为您提供一个仅使用 Ember.js 的解决方案,以防万一。

关于javascript - Emberjs - 如何测试 promise 和其他异步行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22160040/

相关文章:

ember.js - ember 中删除的记录不会从集合中删除

javascript - IE 搞乱了我排序的 EmberJS ArrayProxy

javascript - 在每个幻灯片转换上暂停多个 YouTube Iframe 视频

javascript - 为什么 Dropdown Selected 值作为空值传递给 jQuery 中的 Controller

c# - 在单元测试中等待异步事件引发事件

ember.js - 由于使用 ember-data 1.13.4 记录 inFlight,验收测试失败

javascript - Joomla 加载的旧版本 bootstrap

javascript - AngularJS 中多属性指令的编译和链接顺序?

java - 异步运行方法返回值到回调URL

multithreading - ZeroMQ:如何处理 ZeroMQ 节点中与消息无关的异步事件?