我有這個aurelia組件用於向用戶顯示一個提要,該提要取決於用於提取提要的稱爲Api的自定義API服務類。 Api類有一個get()函數,它依次使用HttpClient獲取數據。Aurelia注入模擬依賴關係
試圖測試組件我想模擬服務類,特別是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服務類的實例,而不是我註冊到容器的模擬實例。
花了最後幾個小時試圖挖掘任何文檔或例如做這樣的事情沒有成功,所以如果任何人都可以協助,我將不勝感激。
或者如果有/有其他方法可以完成這項工作,那麼也可以。
感謝您的回答。在完善後,我得到了幾乎相同的代碼,這裏使用'aurelia.use.standardConfiguration()。instance(Api,mockApi);'而不是'aurelia.container.registerInstance(Api,api); ' 哪AFAICT做同樣的事情。知道是否有任何區別? –
查看類FrameworkConfiguration的源代碼,實例調用Container.registerInstance,因此沒有區別。兩者都記錄在API手冊中。 – martin