集成测试Ember:如何将Ember.run与ember-auth一起使用

时间:2013-09-18 21:20:56

标签: ember.js qunit ember-testing

尝试使用QUnit和Teaspoon运行测试。我有以下测试:

test("Employee signs in", function(){
  visit("/").then(function(){
    return fillIn("#email", "employee@example.com");
  }).then(function(){
    return fillIn("#password", "password");
  }).then(function(){
    return click("#button");
  }).then(function(){
    ok(find("span:contains('Some Text')").length, "Should see Some Text");
  });
});

然而,当我运行测试时,我收到此错误:

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

我的理解是我的应用程序中有一些异步代码需要包装在Ember.run中,因为在测试期间禁用了运行循环。我正在使用ember-auth,我相信下面的代码是登录时发生异步的地方:

  submit: function(event, view) {
    event.preventDefault();
    event.stopPropagation();
    App.Auth.signIn({
      data: {
        email:    this.get('email'),
        password: this.get('password'),
        remember: true, //this.get('remember')

      }
    });
  }

但我不确定如何将它包装在Ember.run中,到目前为止我尝试过的东西都不起作用。如何在Ember.run中包装此代码的异步部分,以便我可以执行测试?

2 个答案:

答案 0 :(得分:0)

尝试将所有代码基本上包装在一个ember运行循环中:

test("Employee signs in", function(){
  Ember.run(function(){
    visit("/").then(function(){
      return fillIn("#email", "employee@example.com");
    }).then(function(){
      return fillIn("#password", "password");
    }).then(function(){
      return click("#button");
    }).then(function(){
      ok(find("span:contains('Some Text')").length, "Should see Some Text");
    });
  });
});

希望它有所帮助。

答案 1 :(得分:0)

ember-auth dev这里。

这并不能完全达到你想要的效果,但我在ember-auth本身(jasmine)中测试时会使用两种方法。

第一种方法是使用API​​模拟,如these specs中所示。基本上我将异步调用转换为同步调用,并使模拟框架立即返回响应ember-auth消耗。

beforeEach ->
  $.mockjax
    url: '/foo'
    type: 'POST'
    status: 200
    # ...
  Em.run -> doSomething()

it 'is successful', ->
  expect(foo).toBe bar

(我在规格中使用了jquery-mockjax。)

第二种方法是忽略ember-auth的作用,并测试您是否正确调用了预期的公共API,如these specs

beforeEach ->
  spy = sinon.collection.spy auth, 'signIn'

it 'is successful', ->
  expect(spy).toHaveBeenCalledWith(/* something */)

希望这有帮助。