在编写QUnit集成测试时,如何处理`Ember.Application.initializer`中的asyc请求?

时间:2013-08-31 01:35:26

标签: ember.js qunit

我正在尝试使用QUnit设置ember.js来编写集成测试。

按照http://emberjs.com/guides/testing/integration/上的说明,我有:

document.write('<div id="ember-testing-container"><div id="ember-testing"></div></div>');

App.rootElement = '#ember-testing';
App.setupForTesting();
App.injectTestHelpers();

module("Integration Tests", {
  setup: function() {
    App.reset();
  }
});

test("root lists first page of posts", function(){
  visit("/").then(function() {
    equal(find(".post").length, 5, "The first page should have 5 posts");
    // Assuming we know that 5 posts display per page and that there are more than 5 posts
  });
});

然而,当我运行QUnit时,我收到以下错误:

Assertion failed: You have turned on testing mode, which disabled the 
run-loop's autorun. You will need to wrap any code with asynchronous 
side-effects in an Ember.run 

触发此断言错误是因为我在应用初始化程序中发出http请求以检查是否存在当前用户会话。如果没有有效用户,则返回401错误。 (如果我强制应用程序始终为此请求返回200,则不会发生此断言错误,并且测试会按预期继续)。

我相信应用程序和API通过为无效用户返回http错误来正常运行,我不想更改为响应200只是为了让我的测试正常运行。我需要做些什么才能让ember和QUnit处理http错误和断言?从我读过的内容来看,我需要用Ember.run包装一些内容,但我无法弄清楚是什么。

1 个答案:

答案 0 :(得分:0)

理想情况下,您的单元和集成测试应与外部资源(如HTTP API)隔离运行,因此mocking HTTP requests is the easiest pattern

要获得真正的全栈烟雾测试,您需要使用PhantomJS等浏览器自动化工具来运行应用程序。