[英]TestBed.OverrideProvider() doesn't work if TestBed.inject() or TestBed.get() (deprecated) has run before
給定下面的示例規范測試
beforeEach(function () {
TestBed.configureTestingModule({
providers: [
{ provide: TranslateService, useClass: TranslateServiceMock },
{ provide: StoreService, useClass: StoreServiceMock },
{
provide: GLOBAL_CONFIG_TOKEN,
useValue: { default: true }
}
],
});
let config = TestBed.inject(GLOBAL_CONFIG_TOKEN);
});
it('should override provider otherwise what is the point? :)', () => {
let config = TestBed.overrideProvider(GLOBAL_CONFIG_TOKEN, { useValue: { default: false, random: 'damn' } });
expect(config).toEqual({default: false, random: 'damn'});
});
問題是測試失敗,因為默認值始終為真,隨機不是配置的屬性。 這意味着在配置測試模塊期間 config 仍然具有默認值,並且提供程序沒有被覆蓋。
知道為什么嗎? overrideProvider方法是否只是更新最初在 configureTestingModule 傳遞的moduleRef object 的助手?
沒錯,因為有一些內置函數會觸發測試模塊的編譯。 如果您想在需要重置 testBed 后更新該值,則只能通過訪問私有屬性來實現,因此不推薦,最好在先創建 env 然后獲取其數據時編寫適當的測試。
盡管如此,您可以在TestBed.overrideProvider
之前執行此操作以使其正常工作。
(getTestBed() as any)._instantiated = false;
(getTestBed() as any)._moduleFactory = undefined;
似乎TestBed.inject在TestBed.overrideProvider之前運行的事實導致 overrideProvider 沒有任何效果。 應在 TestBed.inject() 之前使用 overrideProvider function。 顯然,這似乎只是 configurTestingModule() function 運行后的輔助方法。 因此,上述示例的解決方案是:
beforeEach(function () {
TestBed.configureTestingModule({
providers: [
{ provide: TranslateService, useClass: TranslateServiceMock },
{ provide: StoreService, useClass: StoreServiceMock },
{
provide: GLOBAL_CONFIG_TOKEN,
useValue: { default: true }
}
],
});
});
it('should override provider otherwise what is the point? :)', () => {
TestBed.overrideProvider(GLOBAL_CONFIG_TOKEN, { useValue: { default: false, random: 'damn' } });
let config = TestBed.inject(GLOBAL_CONFIG_TOKEN);
expect(config).toEqual({default: false, random: 'damn'});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.