Угловой модульный тест не пройден из-за компонента в конструкторе. - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть конструктор, который использует это:

  constructor(
    public core: CoreComponent,
  ) {
   //
  }

Но когда я пытаюсь проверить эти компоненты с помощью тестового примера, подобного этому:

describe('CoreSubMenuComponent', () => {
  let component: CoreSubMenuComponent;
  let fixture: ComponentFixture<CoreSubMenuComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        TestingModule.forRoot(),
      ]
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(CoreSubMenuComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});

Я получаю нулевую ошибку инжектора:

Error: StaticInjectorError(DynamicTestModule)[CoreSubMenuComponent -> CoreComponent]: 
  StaticInjectorError(Platform: core)[CoreSubMenuComponent -> CoreComponent]: 
    NullInjectorError: No provider for CoreComponent!

Он импортируется в модуль тестирования, поэтому проблема не в этом. Я также попытался добавить его в массив провайдеров. но это просто перемещает его в угловой рендер, который нельзя добавить в массив провайдеров. Я также добавил тег @injectable() перед тегом @component в CoreComponent, но это не меняет моих тестов, которые не пройдены.

Я пытался получить его с помощью @host(), но выдает ошибку. Я также пытался получить его с Injector, но это также выдает ошибку. Это 4 компонента, которые используют CoreComponent в качестве переменной для получения некоторой информации от них, но они делают тесты неудачными. Все остальные мои тесты прошли хорошо, более 80 тестов Только эти 4 не будут работать, потому что они пытаются получить свойства, которые определены в CoreComponent.

Кто-нибудь знает, как я могу ссылаться на этот компонент с экземпляром, чтобы мои тесты прошли?

1 Ответ

0 голосов
/ 10 сентября 2018

Чтобы исправить эту ошибку, используйте @host en @optional decorators. это говорит компилятору искать его, но не требовать, если он не предоставлен:

  constructor(
    @Host() @Optional() public core: CoreComponent,
  ) {
    //
  }
...