Testing 用承诺测试余烬组件

Testing 用承诺测试余烬组件,testing,ember.js,sinon,Testing,Ember.js,Sinon,我在测试余烬组件时遇到了麻烦 我有一个有动作的组件 伪码 actions: { doSomething(){ this.set('showSpinner', true); this.model.serverOperation().then(()=>{ this.set('showSpinner', false); this.service.doSomething(); })

我在测试余烬组件时遇到了麻烦

我有一个有动作的组件

伪码

actions: {
   doSomething(){
       this.set('showSpinner', true);
       this.model.serverOperation().then(()=>{
           this.set('showSpinner', false); 
           this.service.doSomething();        
       })
   }
}
在我的测试中,我想断言
showSpinner
在调用操作时为true,然后在承诺解析后变为false。所以我的测试看起来像(伪代码,使用ember sinon qunit):

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

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

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

  • 我将最后一个断言更改为在
    setTimeout
    中执行,然后
    showSpinner
    上的断言通过,但是
  • 测试仍然在
    运行之前退出,然后
    运行(因此在超时回调触发之前),并且由于我们使用的是ember sinon qunit,测试线束在
    serviceMock
    预期中失败

  • 在调用
    deferred.resolve()之后,将最后一个断言放入
    then()


    这无助于sinon的失败。
    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();
    
    deferred.promise.then(()=> {
        assert(this.showSpinner, true);
    });