2016-06-10 59 views
2

我在测试一个余烬组件时碰到了一堵墙。用承诺测试余烬组件

我有了一个动作

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

在我的测试组件,我想断言showSpinner是真正被调用的动作时,就变成假的承诺结算后。所以,我的测试看起来像(伪代码,使用烬-兴农-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方法前的最后断言火灾。

是否有一种规范的方式来处理这种类型的事情在烬?

我尝试使用异步测试,但在这种情况下,一些有趣的事情发生了:

  1. 我改变最后的断言在setTimeout来执行,然后在showSpinner通行证断言,但
  2. 测试仍然在then运行之前退出(所以在超时回调触发之前),并且由于我们使用的是ember-sinon-qunit,所以测试工具在预期上失败。

回答

0

把最后断言在then()调用后deferred.resolve()

deferred.resolve(); 

deferred.promise.then(()=> { 
    assert(this.showSpinner, true); 
}); 
+0

没有帮助兴农失败。 – hvgotcodes