Транслокационные каналы, введенные в службу, вызывают ошибки модульного тестирования

#angular #transloco

#угловые #transloco

Вопрос:

Как я могу протестировать службу, которая использует транслокационные каналы (TranslocoDecimalPipe, TranslocoDatePipe и т. Д.)? Очевидно, я мог бы сам издеваться над каналами, но мне не нужно.

Транслокационные каналы в шаблонах моих компонентов корректно работают в модульных тестах. Использование каналов в службе путем их введения в конструктор приводит к прерыванию модульных тестов. Он будет либо жаловаться, что у канала нет поставщика, либо у ChangeDetectorRef нет поставщика.

В приведенном ниже примере мой сервис использует TranslocoDecimalPipe . В моем тесте я получаю ошибку:

 NullInjectorError: StaticInjectorError(DynamicTestModule)[L10nTestService -> TranslocoDecimalPipe]: 
  StaticInjectorError(Platform: core)[L10nTestService -> TranslocoDecimalPipe]: 
    NullInjectorError: No provider for TranslocoDecimalPipe!
 
 import { Injectable } from '@angular/core';
import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest';
import { TranslocoModule } from '@ngneat/transloco';
import { TranslocoDecimalPipe, TranslocoLocaleModule } from '@ngneat/transloco-locale';

@Injectable({ providedIn: 'root' })
class L10nTestService {
  decimalValue: string;

  constructor(private translocoDecimalPipe: TranslocoDecimalPipe) {
    this.decimalValue = translocoDecimalPipe.transform(1234567890.123456);
  }
}

describe('L10ntestService', () => {
  let spectator: SpectatorService<L10nTestService>;
  const createService = createServiceFactory<L10nTestService>({
    service: L10nTestService,
    imports: [
      TranslocoModule,
      TranslocoLocaleModule.init()
    ],
    providers: [TranslocoDecimalPipe]
  });

  beforeEach(() => spectator = createService());

  it('decimal value should be transformed', () => {
    expect(spectator.service.decimalValue).toBe('1,234,567,890.123');
  });
});
 

Комментарии:

1. Я предполагаю, что требуемая для Transloco конфигурация, импорт и поставщики находятся в TranslocoModule, и это метод init(). Убедитесь, что вы ничего не пропустили в настройке тестового примера, вы можете сравнить его с вашим AppModule. Надеюсь, это поможет!

2. Я пробовал это с / без модуля TranslocoRoot, который содержит конфигурации. Я также пробовал это с / без предоставления каналов в ServiceFactory. по-прежнему не удается найти канал

Ответ №1:

Я мог бы заставить это работать с ng-mock. Точно так же, как это:

 imports: [
  ...,
  MockModule(TranslocoLocaleModule),
],