【问题标题】:Testing ember components with promises使用 Promise 测试 ember 组件
【发布时间】: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 进行测试,但在这种情况下会发生一些有趣的事情:

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

【问题讨论】:

    标签: testing ember.js sinon


    【解决方案1】:

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

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

    【讨论】:

    • 这对sinon失败没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多