我有一个反应性表单,已将其拆分为较小的组件,以便能够更好地分别管理每个表单控件。我依靠事件发射器将每个控件的状态传达给管理整个表单状态的“父”组件。
我的给定组件的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
答案 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();
});