0

我正在将 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 响应。

4

3 回答 3

2

我会在你的测试文件中扩展组件,让你的模拟任务覆盖真实的任务。

class TestContainer extends Container {
  @task *myTask(): TaskGenerator<Data> {
    return someMockData;
  }
}

// ...

hooks.beforeEach(function() {
  this.owner.register('component:container', TestContainer);
});
于 2020-12-23T19:09:31.833 回答
1

我不知道有任何方法可以模拟组件中的单个任务以进行测试。当涉及到网络时,我会使用基于伪装者的ember-cli-mirage。Mirage 在使用 ember-data 模型时非常出色,也可用于处理模拟任何网络请求。如果您不使用 ember-data,您可能只想使用伪装者或调查非框架Mirage.js

通过模拟网络并返回预设数据,您将在测试组件时对测试具有相同的控制权。我真的很喜欢这种方法,并且发现它多年来非常可靠和稳定。

于 2020-12-23T18:47:49.187 回答
0

我的项目中确实有与 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);
于 2020-12-24T04:21:04.773 回答