Как выполнить метод на дочернем компоненте в модульном тесте Angular - PullRequest
0 голосов
/ 03 июля 2018

Я запускаю приложение Angular 5 с настройкой теста по умолчанию (Jasmine + Karma).

Допустим, есть компонент с именем Parent, имеющий метод, выполняющий метод для дочернего компонента.

parent.component.ts

@Component({
  selector: 'parent',
...
export class ParentComponent implements {
  @ViewChild(ChildComponent) childComponent: ChildComponent;

  executeChildComponentMethod() {
    this.childComponent.methodToTest();
  }
}

parent.component.spec.ts

import { ParentComponent } from './parent.component'

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

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ParentComponent],
        schemas: [NO_ERRORS_SCHEMA]
      })
      .compileComponents();
    }));

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

  it('should trigger executeChildComponentMethod', () => {
    component.executeChildComponentMethod()
  });
});

Это приводит к тому, что тесты выдают ошибку, в которой говорится, что невозможно выполнить methodToTest с неопределенным значением, что означает, что дочерний компонент не был создан.

Пробовали подходы, такие как создание дочернего компонента внутри блока it, внедрение дочернего компонента в блок it и создание дочернего компонента из другого фиксатора (для дочернего компонента) в тестовом блоке, но безрезультатно.

Как мне заставить тест работать?

1 Ответ

0 голосов
/ 03 июля 2018

Добавьте ChildComponent к declarations массиву, чтобы он был частью вашего модульного теста, что означает, что он будет отображен в виде.

 beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ParentComponent, ChildComponent],
        schemas: [NO_ERRORS_SCHEMA]
      })
      .compileComponents();
  }));

Примечание. Возможно, вам также придется добавить providers из ChildComponent.

РЕДАКТИРОВАТЬ:

Альтернативный подход

Прежде всего, как часть unit testing вы не должны тестировать поведение компонента child внутри компонента parent. Если вы хотите проверить только, вызван или нет метод компонента child, тогда вы можете смоделировать компонент child и определить method, который вы тестируете внутри него. Таким образом, вам не нужно зависеть от child providers во время тестирования.

См. здесь для насмешливых дочерних компонентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...