2

我有这个 aurelia 组件用于向用户显示一个提要,它依赖于一个名为 Api 的自定义 API 服务类来获取提要。Api 类有一个 get() 函数,该函数又使用 HttpClient 来获取数据。

尝试测试组件我想模拟服务类,特别是 get 函数,以返回合适的测试数据并通过 aurelia 的 DI 容器将此模拟注入到组件中。我遇到问题的 DI 部分。

这是组件的js文件的相关部分

import {bindable, inject} from 'aurelia-framework';
import {Api} from 'services/api';

@inject(Api)
export class Feed {
  events = null;

  constructor(api) {
    console.info('feed.js constructor, api:', api)
    this.api = api;
  }

以及我测试中的相关代码

  beforeEach(done => {
    ...
    let mockApi = new Api();
    spyOn(mockApi, 'get').and.returnValue(mockGetResponse);

    const customConfig = (aurelia) => {
      let conf = aurelia.use.standardConfiguration().instance("Api", mockApi);
      console.info('Registering Api:', conf.container.get("Api"));
      return conf;
    }

    const ct = new ComponentTester();
    ct.configure = customConfig;

    sut = ct.withResources('activityfeed/feed');
    sut.inView('<feed username.bind="username"></feed>')
        .boundTo({username: TEST_USER});

    sut.create(bootstrap).then(() => {
      done();
    });
  });

据我所知,这段代码实际上是按照我的预期工作的。在创建组件时,我的 customConfig 函数被调用,mockApi 实例被记录到控制台。

然而,在引导过程的后期,组件构造函数仍然接收实际 Api 服务类的实例,而不是我注册到容器的模拟实例。

花了最后几个小时试图挖掘任何文档或示例来做这样的事情但没有成功,所以如果有人能提供帮助,我将不胜感激。

或者,如果有/有替代方法来实现这一点,那也同样有效。

4

2 回答 2

4

在使用aurelia-testing包测试包含视图和视图模型的标准组件时,我发现更简洁的方法可能是让 Aurelia 创建视图视图模型,并为所有视图使用模拟类模型依赖。

export class MockApi {
  response = undefined;

  get() { return Promise.resolve(this.response) }
}

describe("the feed component", () => {
  let component;
  let api = new MockApi();

  beforeEach(() => {
    api.response = null;

    component = StageComponent
      .withResources("feed/feed")
      .inView("<feed></feed>");

    component.bootstrap(aurelia => {
      aurelia.use
        .standardConfiguration();

      aurelia.container.registerInstance(Api, api);
    });
  });

  it("should work", done => {
    api.response = "My response";

    component.create(bootstrap).then(() => {
      const element = document.querySelector("#selector");
      expect(element.innerHTML).toBe("My response, or something");

      done();
    });
  });
});

这种方法允许您使用普通视图模型类验证呈现的 HTML,模拟依赖项以控制测试数据。

于 2017-01-11T18:19:40.737 回答
0

只是为了回答我自己的问题,至少部分回答它是否对某人有用。

通过使用实际的 Api 类构造函数作为键而不是字符串“Api”,模拟似乎被正确注入。

IE

import {Api} from 'services/api';

...

      let conf = aurelia.use.standardConfiguration().instance(Api, mockApi);

于 2016-08-22T16:16:16.013 回答