我正在使用Sinon与Ember.js并发任务,并试图在测试中存根任务。
代码如下所示:
组件.ts
文件:
import Component from '@glimmer/component';
import { TaskGenerator, TaskInstance } from 'ember-concurrency';
import { task } from 'ember-concurrency-decorators';
import { taskFor } from 'ember-concurrency-ts';
export default class Container extends Component<Args> {
@task *myTask(): TaskGenerator<Data> {
const response: Data = yield json('someURL'); //json() returns a JSON object from a request to someURL
return response;
}
get task(): TaskInstance<Data> | null {
const task = taskFor(this.myTask);
return task.last ? task.last : task.perform();
}
@action
someMethod(): void {
const task = taskFor(this.myTask);
task.perform();
}
}
组件测试文件中的相关测试:
...
module('Integration | Component | container', function(hooks){
test('some test', async function(this: Context, assert) {
await render(hbs`
<Container @someMethod={{@someArgument}} as |c| >
// some code that uses c
</Container>
`);
}
我应该如何stub myTask任务呢?我实际上希望拥有它,这样我就可以手动控制myTask发出的响应,这样就不必在测试中做出HTTP响应。
3条答案
按热度按时间pgky5nke1#
我将扩展测试文件中的组件,并使用模拟任务覆盖真实的任务。
s5a0g9ez2#
我不知道有什么方法可以模拟组件中的单个任务进行测试。当涉及到网络时,我选择了基于pretender构建的ember-cli-mirage。Mirage在处理ember数据模型时非常好,还可以用于处理模拟任何网络请求。如果您没有使用ember数据,您可能只需要使用pretender或研究非框架Mirage.js。
通过模拟网络并返回现成的数据,您将在测试组件时拥有相同的控制权。我真的很喜欢这种方法,并发现它在几年内非常可靠和稳定。
mhd8tkvw3#
在我的项目中,我确实有一些任务要处理sinon。它的构建与你的设置有点不同,但也许你会得到一些灵感。
我的组件中有这个任务
而这个
asXls
方法在服务中然后在我的集成测试中我这样做存根
之后我可以做日常检查