Как проверить кодовую логику ngOnInit в Jasmine и Angular - PullRequest
0 голосов
/ 20 февраля 2019

Мой компонент ищет наличие параметра в route в ngOnInit.Если параметр отсутствует, он показывает ошибку.Я хочу проверить эту логику.

ngOnInit() {
    this.id = this.route.snapshot.paramMap.get("id");
    if(this.id != null) {
...    } else{
      console.log("didn't get id from the route");
      this.showDialog(...);
    }
  }

Я написал следующую спецификацию.В спецификации параметр не передается в route

 beforeEach(async() => {

    fixture = TestBed.createComponent(QuestionDetailsComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

fit('should show error if question details of a question can\'t be retrieved', () => {
    spyOn(component,'showDialog');
    expect(componetn.showDialog).toHaveBeenCalled();
  });

, но мой тестовый пример не проходит по причине Expected spy showDialog to have been called.

Полагаю, проблема в том, что showDialog получаетвызывается, когда компонент создается до вызова it.

Как проверить логику в ngOnInit?Мне нужен компонент, прежде чем я смогу его протестировать (например, вызвать it), и я хочу проверить логику, которая выполняется во время создания компонента.

1 Ответ

0 голосов
/ 21 февраля 2019

Чтобы протестировать метод ngOnInit, вам просто нужно вызвать его:

component.ngOnInit();

И можно указать значение маршрута:

spyOn(component.route.snapshot.paramMap,"get").and.returnValue("some_id");

Также вы можете изменить возвращаемое значение,Например:

fit("should ...", () => {
  let mock_id = null;
  spyOn(component,"showDialog");

  spyOn(component.route.snapshot.paramMap,"get").and.callFake(() => {
      return mock_id;
  });

  component.ngOnInit();
  expect(componetn.showDialog).toHaveBeenCalled();
  expect(componetn.showDialog).toHaveBeenCalledTimes(1);

  mock_id = "some_value";
  component.ngOnInit();
  expect(...).to..
  ...
  expect(componetn.showDialog).toHaveBeenCalledTimes(1);

  mock_id = "another_value";
  component.ngOnInit();
  expect(...).to..
  ...
  expect(componetn.showDialog).toHaveBeenCalledTimes(1);
});
...