[英]How do I go about stubbing a Task in Ember.js?
我正在將 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>
`);
}
我將如何存根 myTask 任務? 我基本上想擁有它,以便我能夠手動控制來自 myTask 的響應,因此不必在測試中做出 HTTP 響應。
我會在你的測試文件中擴展組件,讓你的模擬任務覆蓋真實的任務。
class TestContainer extends Container {
@task *myTask(): TaskGenerator<Data> {
return someMockData;
}
}
// ...
hooks.beforeEach(function() {
this.owner.register('component:container', TestContainer);
});
我不知道有任何方法可以模擬組件中的單個任務以進行測試。 當涉及到網絡時,我會使用基於偽裝者的ember-cli-mirage 。 Mirage 在處理 ember-data 模型時非常出色,也可用於處理 mocking 任何網絡請求。 如果您不使用 ember-data,您可能只想使用偽裝者或調查非框架Mirage.js 。
通過 mocking 網絡和返回預設數據,您將在測試組件時對測試具有相同的控制權。 我真的很喜歡這種方法,並且發現它多年來非常可靠和穩定。
我的項目中確實有與 sinon 相關的任務。 它的構建與您的設置略有不同,但也許您可能會得到一些靈感。
所以我的組件中有這個任務
@(task(function* () {
yield this.exportxls.asXls.perform(someArg);
})) downloadXls;
這個asXls
方法在服務中
@(task(function* (mapping) {
// ...
}).drop()) asXls;
然后在我的集成測試中我做這樣的存根
this.owner.register('service:exportxls', Service.extend({
init() {
this._super(...arguments);
this.set('asXls', {
perform: sinon.stub()
});
}
}));
之后我可以進行常規檢查
assert.ok(exportService.asXls.perform.calledOnce);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.