Javascript 单元测试ember并发任务和产量
我们的项目中有很多代码由于ember并发任务而没有涵盖 对于包含以下内容的控制器,是否有一种简单的单元测试方法:Javascript 单元测试ember并发任务和产量,javascript,unit-testing,ember.js,ember-testing,ember-concurrency,Javascript,Unit Testing,Ember.js,Ember Testing,Ember Concurrency,我们的项目中有很多代码由于ember并发任务而没有涵盖 对于包含以下内容的控制器,是否有一种简单的单元测试方法: export default Controller.extend({ updateProject: task(function* () { this.model.project.set('title', this.newTitle); try { yield this.model.project.save();
export default Controller.extend({
updateProject: task(function* () {
this.model.project.set('title', this.newTitle);
try {
yield this.model.project.save();
this.growl.success('success');
} catch (error) {
this.growl.alert(error.message);
}
})
});```
您可以通过调用
someTask.perform()
对这样的任务进行单元测试。对于给定的任务,您可以存根您需要的内容,以便对其进行彻底测试:
test('update project task sets the project title and calls save', function(assert) {
const model = {
project: {
set: this.spy(),
save: this.spy()
}
};
const growl = {
success: this.spy()
};
// using new syntax
const controller = this.owner.factoryFor('controller:someController').create({ model, growl, newTitle: 'someTitle' });
controller.updateProject.perform();
assert.ok(model.project.set.calledWith('someTitle'), 'set project title');
assert.ok(growl.success.calledWith('success'), 'called growl.success()');
});
这是使用来自和的间谍从测试上下文访问sinon,但这些对于单元测试不是必需的。您可以使用断言而不是间谍来存根模型和服务等:
const model = {
project: {
set: (title) => {
assert.equal(title, 'someTitle', 'set project title');
},
save: () => {
assert.ok(1, 'saved project');
}
}
};
要测试可以从stubbedmodel.project.save()方法抛出的捕获:
const model = {
project: {
...
save: () => throw new Error("go to catch!")
}
};