#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),
],