簡體   English   中英

如果 TestBed.inject() 或 TestBed.get() (已棄用)之前運行過,則 TestBed.OverrideProvider() 不起作用

[英]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.injectTestBed.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM