如何在Ember.js中设置任务存根?

k3fezbri  于 2022-11-23  发布在  其他
关注(0)|答案(3)|浏览(148)

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

pgky5nke

pgky5nke1#

我将扩展测试文件中的组件,并使用模拟任务覆盖真实的任务。

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

// ...

hooks.beforeEach(function() {
  this.owner.register('component:container', TestContainer);
});
s5a0g9ez

s5a0g9ez2#

我不知道有什么方法可以模拟组件中的单个任务进行测试。当涉及到网络时,我选择了基于pretender构建的ember-cli-mirage。Mirage在处理ember数据模型时非常好,还可以用于处理模拟任何网络请求。如果您没有使用ember数据,您可能只需要使用pretender或研究非框架Mirage.js
通过模拟网络并返回现成的数据,您将在测试组件时拥有相同的控制权。我真的很喜欢这种方法,并发现它在几年内非常可靠和稳定。

mhd8tkvw

mhd8tkvw3#

在我的项目中,我确实有一些任务要处理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);

相关问题