我有这个 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 服务类的实例,而不是我注册到容器的模拟实例。
花了最后几个小时试图挖掘任何文档或示例来做这样的事情但没有成功,所以如果有人能提供帮助,我将不胜感激。
或者,如果有/有替代方法来实现这一点,那也同样有效。