Переопределить провайдера TestBed для конкретного теста - PullRequest
1 голос
/ 30 октября 2019

У меня есть компонент, который имеет две зависимости: одна LOCALE_ID определена глобально в угловом формате, другая - это язык, определенный в Компоненте как { provide: LANGUAGE_TOKEN, useValue: navigator.language }

Для тестирования я оба переопределяю их вTestBed для всех тестов, поэтому тесты не вводят ничего из браузера Chrome, выполняющего тесты кармы, и тесты не имеют других результатов в зависимости от среды тестирования:

TestBed.configureTestingModule({
  declarations: [
    MyComponent, RouterStubComponent,
  ],
  imports: [
    MatToolbarModule, RouterTestingModule, MatIconModule, MatButtonModule,
  ],
  providers: [
    {provide: LOCALE_ID, useValue: 'en-US' },
  ]
}).compileComponents();

TestBed.overrideProvider(LOCATION_TOKEN, {useValue: locationStub});
TestBed.overrideProvider(LANGUAGE_TOKEN, {useValue: 'en-US' });

Теперь у меня есть некоторая логика вкомпонент, который зависит от локали и языка браузера, поэтому мне нужно издеваться над ними. Насмешка LANGUAGE_TOKEN была супер легкой, просто неудобством:

 it('should redirect to spanish when in spanish browser', () => {
    TestBed.overrideProvider(LANGUAGE_TOKEN, {useValue: 'es'});
    fixture = TestBed.createComponent(MyComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();

    expect(hrefSpy.calls.count()).toBe(1);
    expect(hrefSpy.calls.argsFor(0)[0]).toEqual(environment.spanUrl);
  });

Однако переопределение LOCALE_ID с тем же кодом не работает.

  it('should ...', () => {
    TestBed.overrideProvider(LOCALE_ID, {useValue: 'es-ES'});
    console.log(TestBed.get(LOCALE_ID)); // en-US!!!!
    fixture = TestBed.createComponent(MamanComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();

    expect(hrefSpy.calls.count()).toBe(1); //FAIL
    expect(hrefSpy.calls.argsFor(0)[0]).toEqual(environment.engUrl);//FAIL
  });

Мне не удалось найти работающийответьте на этот вопрос либо.

1 Ответ

2 голосов
/ 30 октября 2019

Это потому, что как только вы вызываете compileComponents, поставщики замораживаются и не будут переопределены.

Либо удалите LOCALE_ID из поставщиков, чтобы его значение не было заморожено. (Но обязательно предоставьте его с помощью overrideProviders до создания экземпляра компонента )

TestBed.configureTestingModule({
  declarations: [
    MyComponent, RouterStubComponent,
  ],
  imports: [
    MatToolbarModule, RouterTestingModule, MatIconModule, MatButtonModule,
  ],
  providers: [
    --> remove 
  ]
}).compileComponents();

TestBed.overrideProvider(LOCALE_ID, {useValue: 'es-ES'});
//Add it before creating component, to have a default value in each test, add it in a beforeEach block.

ИЛИ

Вы можете вызывать compileComponents перед созданием экземпляра компонента в каждом тесте.

TestBed.configureTestingModule({
  declarations: [
    MyComponent, RouterStubComponent,
  ],
  imports: [
    MatToolbarModule, RouterTestingModule, MatIconModule, MatButtonModule,
  ],
  providers: [
    {provide: LOCALE_ID, useValue: 'en-US' },
  ]
});
--> remove compileComponents

Затем в каждом тесте:

it('should ...', () => {
    TestBed.overrideProvider(LOCALE_ID, {useValue: 'es-ES'});
    // Add here
    TestBed.compileComponents();
    fixture = TestBed.createComponent(MamanComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();

    expect(hrefSpy.calls.count()).toBe(1); //FAIL
    expect(hrefSpy.calls.argsFor(0)[0]).toEqual(environment.engUrl);//FAIL
  });
...