Angular / Jasmine - Шпионы работают, если вызваны на ngOnInit? - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть реактивная форма, которую я разделил на более мелкие компоненты, чтобы иметь возможность лучше управлять каждым элементом формы в отдельности.Я полагаюсь на источники событий, чтобы иметь возможность сообщать о состоянии каждого элемента управления «родительскому» компоненту, который управляет состоянием всей формы.

Мой метод ngOnInit для данного компонента выглядит следующим образом:

@Output() formReady: EventEmitter<FormControl> = new EventEmitter();

ngOnInit() {
    (some other unrelated logic here...)
    this.formReady.emit(this.userIdFormControl);
  }

Тест, который я пытаюсь написать для этого компонента, довольно прост

it('should emit formReady event when component is initialised', () => {
    spyOn(component.formReady, 'emit');
    expect(component.formReady.emit).toHaveBeenCalled();
  });

Однако этот тест не пройден, потому что шпион никогда не вызывается (хотя, если я добавлю clgЗаявление для ngOnInit Я вижу, как оно печатается столько раз, сколько ожидалось).

Мой вопрос: могут ли шпионы быть вызваны на ngOnInit?Я не понимаю, почему они не работают, но вы никогда не знаете!

Заранее спасибо,

Tiago

1 Ответ

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

Проблема в том, что OnInit вызывается до того, как spy был создан.Это потому, что вы можете звонить fixture.detectChanges() в beforEach блоке.Просто удалите это и назовите его в вашей спецификации.

it('should emit formReady event when component is initialised', () => {
    spyOn(component.formReady, 'emit');
    fixture.detectChanges()
    expect(component.formReady.emit).toHaveBeenCalled();
});

Или, в качестве альтернативы, вы можете снова вызвать метод ngOnInit() в вашей спецификации, чтобы увидеть, работает ли он.

it('should emit formReady event when component is initialised', () => {
      spyOn(component.formReady, 'emit');
      component.ngOnInit();
      expect(component.formReady.emit).toHaveBeenCalled();
});
...