Ember.js 在控制器中测试异步操作
Ember.js Testing async action in controller
我有一个控制器,它有一个动作调用一个方法来做一些异步的事情和return一个承诺。
export default Ember.Controller.extend({
_upload: function() {
// return a promise
},
actions: {
save: function(item) {
this._upload(item).then(function(response) {
// Handle success
}, function(error) {
// Handle error
}
}
}
});
我想对 Handle success
和 Handle error
下的代码进行单元测试。
在我的单元测试中,我使用
模拟了 _uploadMethod
controller.set("_upload", function() {
return new Ember.RSVP.Promise(function(resolve) {
resolve({name: "image1"});
});
});
然后我调用操作并断言成功处理程序已完成作业
controller.send("save", "item");
assert.equal(controller.get("selected.item"), "item");
问题是断言失败,因为在 运行 承诺得到解决并且成功处理程序中的所有内容都已完成之前。
如何在检查断言之前等待承诺解决?
如果您尝试这样做会怎样:
controller.set("_upload", function() {
const promise = new Ember.RSVP.Promise(function(resolve) {
resolve({name: "image1"});
});
promise.then(() => Ember.run.next(() => {
assert.equal(controller.get("selected.item"), "item");
}));
return promise;
});
controller.send("save", "item");
方法有点老套,但可能行得通。
要测试异步方法,您可以使用测试助手 waitUntil
等待方法的预期 return,如下面的代码。
controller.send('changeStepAsyncActionExample');
await waitUntil(() => {
return 'what you expect to the Promise resolve';
}, { timeout: 4000, timeoutMessage: 'Your timeout message' });
// If not timeout, the helper below will be executed
assert.ok(true, 'The promise was executed correctly');
我有一个控制器,它有一个动作调用一个方法来做一些异步的事情和return一个承诺。
export default Ember.Controller.extend({
_upload: function() {
// return a promise
},
actions: {
save: function(item) {
this._upload(item).then(function(response) {
// Handle success
}, function(error) {
// Handle error
}
}
}
});
我想对 Handle success
和 Handle error
下的代码进行单元测试。
在我的单元测试中,我使用
_uploadMethod
controller.set("_upload", function() {
return new Ember.RSVP.Promise(function(resolve) {
resolve({name: "image1"});
});
});
然后我调用操作并断言成功处理程序已完成作业
controller.send("save", "item");
assert.equal(controller.get("selected.item"), "item");
问题是断言失败,因为在 运行 承诺得到解决并且成功处理程序中的所有内容都已完成之前。
如何在检查断言之前等待承诺解决?
如果您尝试这样做会怎样:
controller.set("_upload", function() {
const promise = new Ember.RSVP.Promise(function(resolve) {
resolve({name: "image1"});
});
promise.then(() => Ember.run.next(() => {
assert.equal(controller.get("selected.item"), "item");
}));
return promise;
});
controller.send("save", "item");
方法有点老套,但可能行得通。
要测试异步方法,您可以使用测试助手 waitUntil
等待方法的预期 return,如下面的代码。
controller.send('changeStepAsyncActionExample');
await waitUntil(() => {
return 'what you expect to the Promise resolve';
}, { timeout: 4000, timeoutMessage: 'Your timeout message' });
// If not timeout, the helper below will be executed
assert.ok(true, 'The promise was executed correctly');