1

尝试使用 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 中以便我可以执行测试?

4

2 回答 2

0

ember-auth开发人员在这里。

这并不能完全实现您想要的,但是我在测试它ember-auth本身时使用了两种方法(使用jasmine)。

第一种方法是使用 API 模拟,如这些规范中所示。基本上,我将异步调用转换为同步调用,并让模拟框架立即返回响应以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,如这些规范中所示。

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

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

希望这可以帮助。

于 2013-09-30T13:48:01.247 回答
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");
    });
  });
});

希望能帮助到你。

于 2013-09-19T08:30:48.763 回答