NullInjectorError: StaticInjectorError (DynamicTestModule) при тестировании в Angular 2 - PullRequest
0 голосов
/ 01 марта 2019

Я новичок в Angular2 и пытаюсь написать тест в файле app.component.spec.ts.Мое приложение относительно простое, кроме того факта, что оно импортирует LoginComponent и LogoutComponent из сторонней библиотеки (написанной коллегами).Компоненты используются для входа в систему или выхода из нее, соответственно, довольно просто.Запуск ng serve компилируется нормально, а приложение работает «гладко».Выполнение ng test, однако, дает мне эту ошибку:

NullInjectorError: StaticInjectorError(DynamicTestModule)[LogoutComponent -> SessionService]: 
  StaticInjectorError(Platform: core)[LogoutComponent -> SessionService]: 
    NullInjectorError: No provider for SessionService!

LogoutComponent импортируется из другого проекта.Означает ли эта ошибка, что мне нужно войти в этот проект и внести некоторые изменения, или я должен каким-то образом издеваться над SessionService в моем проекте?

Код спецификации:

import {} from 'jasmine';
import {async, TestBed} from '@angular/core/testing';
import {RouterTestingModule} from '@angular/router/testing';
import {AuthErrorStateService, LogoutComponent} from '@custom-library';

import {AppComponent} from './app.component';
import {AppErrorStateService} from './core/error-states/app-error-state.service';
import {TopNavComponent} from './core/top-nav/top-nav.component';

describe('AppComponent', () => {
  beforeEach(async(() => {
    TestBed
        .configureTestingModule({
          imports: [RouterTestingModule],
          providers: [
            AppErrorStateService, AuthErrorStateService
          ],
          declarations: [AppComponent, TopNavComponent, LogoutComponent],
        })
        .compileComponents();
  }));

  it('should create the app', () => {
    const fixture = TestBed.createComponent(AppComponent);
    const app = fixture.debugElement.componentInstance;
    expect(app).toBeTruthy();
  });

  it(`should have as title 'My App'`, () => {
    const fixture = TestBed.createComponent(AppComponent);
    const app = fixture.debugElement.componentInstance;
    expect(app.title).toEqual('My App');
  });

  it('should render title in a h1 tag', () => {
    const fixture = TestBed.createComponent(AppComponent);
    fixture.detectChanges();
    const compiled = fixture.debugElement.nativeElement;
    expect(compiled.querySelector('h1').textContent).toEqual('Welcome to My App!');
  });
});

1 Ответ

0 голосов
/ 06 марта 2019

Проблема заключается в объявлении нескольких компонентов в TestBed следующим образом:

 declarations: [AppComponent, TopNavComponent, LogoutComponent]

приводит к созданию нескольких компонентов при вызове теста compileComponents().Когда это происходит, каждому компоненту в массиве declarations нужны свои зависимости, объявленные в массиве providers, для завершения создания экземпляра.Один из объявленных компонентов зависит от SessionService, но эта услуга отсутствует у провайдеров, поэтому вы получаете NullInjectorError.

. Для этого есть два решения:

  • объявляйте только один компонент в массиве declarations и добавляйте schemas: [ CUSTOM_ELEMENTS_SCHEMA ] к объекту конфигурации TestBed
  • продолжайте объявлять несколько компонентов и добавлять все зависимости (или их макеты) для каждого компонента в providers массив
...