使用promises测试ember组件

时间:2016-06-10 14:59:31

标签: testing ember.js sinon

我在测试一个余烬组件时遇到了障碍。

我有一个有行动的组件

伪代码

actions: {
   doSomething(){
       this.set('showSpinner', true);
       this.model.serverOperation().then(()=>{
           this.set('showSpinner', false); 
           this.service.doSomething();        
       })
   }
}

在我的测试中,我想声明showSpinner在调用操作时为真,然后在promise解析后变为false。所以我的测试看起来像(伪代码,使用ember-sinon-qunit):

const deferred = Ember.RSVP.defer();
const modelMock = this.mock(this.model);
const serviceMock = this.mock(this.service);

modelMock.expects('serverOperation').returns(deferred.promise);
serviceMock.expects('doSomething);

this.$('selector').click(); // invokes 'doSomething'

assert(this.showSpinner, true)

deferred.resolve();

assert(this.showSpinner, true)

问题是,在deferred.resolve()调用中,最后一个断言在组件中的then方法之前触发。

在ember中有没有一种规范的方法来处理这类事情?

我尝试使用async进行测试,但在这种情况下会发生一些有趣的事情:

  1. 我将最终断言更改为在setTimeout中执行,然后showSpinner上的断言通过,但
  2. 测试仍然在then运行之前退出(因此在超时回调触发之前),并且因为我们正在使用ember-sinon-qunit,所以测试工具在serviceMock预期失败。

1 个答案:

答案 0 :(得分:0)

在调用then()

之后,将最后一个断言放入deferred.resolve()
deferred.resolve();

deferred.promise.then(()=> {
    assert(this.showSpinner, true);
});
相关问题