我在测试一个余烬组件时遇到了障碍。
我有一个有行动的组件
伪代码
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进行测试,但在这种情况下会发生一些有趣的事情:
setTimeout
中执行,然后showSpinner
上的断言通过,但then
运行之前退出(因此在超时回调触发之前),并且因为我们正在使用ember-sinon-qunit,所以测试工具在serviceMock
预期失败。答案 0 :(得分:0)
在调用then()
deferred.resolve()
deferred.resolve();
deferred.promise.then(()=> {
assert(this.showSpinner, true);
});