我有一个执行异步操作的控制器,我想对其进行测试:
/*globals Ember, momnent*/
import { raw as icAjaxRaw } from 'ic-ajax';
//...
actions: {
foo: function() {
var req = icAjaxRaw({
type: 'POST',
url: ApiUtils.apiUrl+'/dofoo',
processData: false,
});
return req.then(
function resolve(result) {
console.log(result.response);
this.set('fooLastDoneAt', moment());
}.bind(this)
);
},
...在测试中:
test('actions.foo', function() {
expect(2);
var ctrl = this.subject();
var model = {
fooLastDoneAt: moment().add(-10, 'days'),
};
ctrl.set('model', model);
ok(ctrl.get('fooLastDoneAt').isBefore(moment().add(-1, 'days')), true, 'initial');
ctrl.send('foo');
ok(ctrl.get('fooLastDoneAt').isBefore(moment().add(-1, 'days')), false, 'updated date');
});
但是,这不可避免地会导致在另一个不相关的测试用例中抛出错误:
"Uncaught Error: Assertion Failed: calling set on destroyed object"[
这一定会发生,因为this.set('fooLastDoneAt', moment());
在这个测试用例完成之后执行,并且测试运行器已经teardown
为这个模块做了一个,然后继续下一个;当动作仍在执行时。
有没有办法让我等待一个动作异步完成,然后再进行下一步的单元测试?
@kingpin2k 建议使用此解决方案,您可以在其中将承诺延迟对象传递到操作中。但是,在我的应用程序中,应用程序本身永远不会这样做,如果我需要修改我的应用程序源以便对其进行测试,这似乎是一个基本问题 - 特别是因为它增加了复杂性。
还有其他方法可以使测试执行等待操作完成吗?