[英]Unit testing ember-concurrency tasks and yields
由于 ember 并发任务,我们的项目中有很多代码没有被覆盖。
是否有一种直接的方法对包含以下内容的 controller 进行单元测试:
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和ember-sinon-qunit的间谍从测试上下文访问 sinon,但这些对于单元测试不是必需的。 您可以使用断言而不是间谍来存根 model 和服务等:
const model = {
project: {
set: (title) => {
assert.equal(title, 'someTitle', 'set project title');
},
save: () => {
assert.ok(1, 'saved project');
}
}
};
要测试捕获,您可以从您的存根model.project.save()
方法中抛出:
const model = {
project: {
...
save: () => throw new Error("go to catch!")
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.