TestBed.OverrideProvider () не работает, если TestBed.inject () или TestBed.get () (устарело) выполнялись раньше - PullRequest
0 голосов
/ 29 мая 2020

В примере spe c тест ниже

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'});
});

дело в том, что тест не удался, потому что по умолчанию всегда true и random не является свойством config. Это означает, что конфигурация все еще имеет значение по умолчанию во время настройки модуля тестирования, и поставщик не был переопределен.

Есть идеи, почему? Является ли метод overrideProvider просто помощником, который обновляет объект moduleRef , изначально переданный в configureTestingModule?

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Это верно, потому что есть встроенные функции, запускающие компиляцию тестового модуля. Если вы хотите обновить значение после того, как вам нужно сбросить testBed, это можно сделать только через доступ к частным свойствам и поэтому не рекомендуется, лучше было бы написать правильный тест, когда сначала создается env, а затем извлекаются его данные.

Тем не менее, это то, что вы можете сделать до TestBed.overrideProvider, чтобы заставить его работать.

  (getTestBed() as any)._instantiated = false;
  (getTestBed() as any)._moduleFactory = undefined;
0 голосов
/ 29 мая 2020

Кажется, что тот факт, что TestBed.inject выполняется до TestBed.overrideProvider , приводит к тому, что overrideProvider не имеет никакого эффекта. Перед TestBed.inject () следует использовать функцию overrideProvider. По-видимому, это всего лишь вспомогательный метод после запуска функции configurTestingModule (). Итак, решение приведенного выше примера:

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'});
});
...