test - нет поставщика TranslateService - PullRequest
0 голосов
/ 08 мая 2020

Я запускаю несколько тестов с помощью команды ng test и получаю следующее сообщение об ошибке:

NullInjectorError: R3InjectorError(DynamicTestModule)[TranslateService -> TranslateService]: 
  NullInjectorError: No provider for TranslateService!

Тест:

import { TestBed, async, ComponentFixture } from '@angular/core/testing';
import { AppComponent } from './app.component';
import { TranslateTestingModule } from 'ngx-translate-testing';
import { CoreModule } from './core.module';

const ENGLISH_LANGUAGE = 'en';

describe('AppComponent', () => {

  let fixture: ComponentFixture<AppComponent>;
  let appComponent: AppComponent;

  beforeEach(() => {
    fixture = TestBed.createComponent(AppComponent);
    fixture.detectChanges();
    appComponent = fixture.componentInstance;
  });

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [
        AppComponent
      ],
      imports: [
        CoreModule,
        TranslateTestingModule
          .withTranslations(ENGLISH_LANGUAGE, require('assets/i18n/en.json'))
          .withDefaultLanguage(ENGLISH_LANGUAGE)
      ],
    }).compileComponents();
  });

  it('should create the app', async(() => {
    expect(appComponent).toBeTruthy();
  }));

  it('should have as title', async(() => {
    appComponent.ngOnInit();
    fixture.whenStable().then(() => {
      expect(appComponent.testTitle).toEqual('app');
    })
  }));

});

И компонент:

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {

  testTitle?: string;

  constructor(
    private translateService: TranslateService,
    private screenDeviceService: ScreenDeviceService
  ) {}

  public ngOnInit() {
    const subscription: Subscription = this.translateService.get('app.title').subscribe((text: string) => {
      this.afterLanguageResourcesLoaded();
      subscription.unsubscribe();
    });
  }

  private afterLanguageResourcesLoaded(): void {
    this.setAppMetaData();
  }

  private setAppMetaData(): void {
    this.screenDeviceService.setMetaData({
      title: this.translateService.instant('app.title'),
      description: this.translateService.instant('app.description')
    });
    this.testTitle = this.translateService.instant('app.title');
  }

}

Я также попытался импортировать модуль BrowserModule:

imports: [
  BrowserAnimationsModule,

И я попытался добавить поставщика TranslateService:

providers: [
  TranslateService
]

Наконец-то попробовал с двумя переменными-членами для двух служб, которые должны быть введены в конструктор компонента:

let translateService: TranslateService;
let screenDeviceService: ScreenDeviceService;

и предоставление их:

providers: [
  TranslateService,
  ScreenDeviceService
]

и получение их:

translateService = TestBed.get(TranslateService);
screenDeviceService = TestBed.get(ScreenDeviceService);

Но ничего не помогло.

У меня меньше Angular 9.0.4

ОБНОВЛЕНИЕ: в итоге я использовал реальный сервис перевода вместо имитируемого, и мне пришлось убить тестера и введите снова команду ng test, чтобы мой исходный код был рассмотрен.

1 Ответ

0 голосов
/ 08 мая 2020

В вашем тестовом файле spe c .ts вы можете добавить этот тип импорта с forRoot():

TranslateModule.forRoot()

Пример:

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        RouterTestingModule,
        TranslateModule.forRoot(),
        HttpClientTestingModule
      ],
      declarations: [ HomeComponent ],
      schemas: [ NO_ERRORS_SCHEMA ]
    })
    .compileComponents();
  }));

Это потому, что вы не нужно тестировать TranslateModule тоже. Мне подходит это решение.

...