Angular / Jasmine-如果在ngOnInit上调用,间谍程序是否起作用?

时间:2019-02-16 11:56:32

标签: angular unit-testing jasmine karma-jasmine karma-runner

我有一个反应性表单,已将其拆分为较小的组件,以便能够更好地分别管理每个表单控件。我依靠事件发射器将每个控件的状态传达给管理整个表单状态的“父”组件。

我的给定组件的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();
  });

但是此测试失败了,因为Spy从未被调用(尽管如果我向ngOnInit添加clg语句,我可以看到它被打印了预期的多次)。

我的问题是:可以在ngOnInit上调用间谍吗?我看不到为什么它们不起作用,但你永远不知道!

预先感谢

Tiago

1 个答案:

答案 0 :(得分:2)

问题在于,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();
});