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);
});