簡體   English   中英

我如何 go 關於在 Ember.js 中存根任務?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM