【发布时间】:2016-06-10 14:59:30
【问题描述】:
我在测试 ember 组件时碰壁了。
我有一个有动作的组件
伪代码
actions: {
doSomething(){
this.set('showSpinner', true);
this.model.serverOperation().then(()=>{
this.set('showSpinner', false);
this.service.doSomething();
})
}
}
在我的测试中,我想断言 showSpinner 在调用操作时为真,然后在承诺解决后变为假。所以我的测试看起来像(伪代码,使用 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的预期下失败。
【问题讨论】: