gpt4 book ai didi

使用 promises 测试 ember 组件

转载 作者:行者123 更新时间:2023-11-28 20:14:22 25 4
gpt4 key购买 nike

我在测试 ember 组件时遇到了瓶颈。

我有一个有 Action 的组件

伪代码

actions: {
doSomething(){
this.set('showSpinner', true);
this.model.serverOperation().then(()=>{
this.set('showSpinner', false);
this.service.doSomething();
})
}
}

在我的测试中,我想断言 showSpinner 在调用操作时为 true,然后在 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 中是否有一种规范的方式来处理这类事情?

我尝试使用异步进行测试,但在那种情况下会发生一些有趣的事情:

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

最佳答案

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

deferred.resolve();

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

关于使用 promises 测试 ember 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37751416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com