为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

烙印99 2024-01-18 16:39:52
我正在将 Sinon 与 Ember.js 并发任务一起使用,并尝试在测试中存根该任务。代码如下所示:组件文件:.tsimport 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 响应。
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

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


class TestContainer extends Container {

  @task *myTask(): TaskGenerator<Data> {

    return someMockData;

  }

}


// ...


hooks.beforeEach(function() {

  this.owner.register('component:container', TestContainer);

});


查看完整回答
反对 回复 2024-01-18
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

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

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


查看完整回答
反对 回复 2024-01-18
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

在我的项目中,我确实有使用 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);


查看完整回答
反对 回复 2024-01-18
  • 3 回答
  • 0 关注
  • 34 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信