Angular5中如何测试Material Autocomplete的optionSelected事件是否调用正确函数
如何测试Angular Material Autocomplete的optionSelected事件是否调用正确函数
要验证<mat-autocomplete>的optionSelected事件是否正确触发了onNewsRoomSelect函数,你可以按照以下步骤编写单元测试,核心思路是创建方法间谍、手动触发事件、验证间谍调用情况:
完整测试用例示例
it('should call onNewsRoomSelect when autocomplete option is selected', () => { // 1. 准备模拟的NewsRoomSource数据,和你实际项目中的数据结构保持一致 const mockNewsRoom: NewsRoomSource = { sourceName: 'Sample News Room', sourceType: 'Internal' }; // 2. 在组件的onNewsRoomSelect方法上创建Jasmine间谍,用来监听调用情况 spyOn(component, 'onNewsRoomSelect'); // 3. 获取MatAutocomplete的组件实例 const autocompleteEl = fixture.debugElement.query(By.directive(MatAutocomplete)); const autocomplete = autocompleteEl.componentInstance; // 4. 手动触发optionSelected事件,传递模拟的选项对象 autocomplete.optionSelected.emit({ option: { value: mockNewsRoom } }); // 5. 触发变更检测,确保组件响应事件 fixture.detectChanges(); // 6. 断言:验证onNewsRoomSelect被调用,且传递了正确的参数 expect(component.onNewsRoomSelect).toHaveBeenCalledWith(mockNewsRoom); });
关键步骤解释
- 创建间谍:用
spyOn(component, 'onNewsRoomSelect')可以监听这个方法的调用次数、传入参数等,这是单元测试中验证方法调用的常用手段。 - 触发事件:直接通过
autocomplete.optionSelected.emit(...)触发事件,比模拟用户点击<mat-option>更直接高效,还能精准控制传递的参数内容。 - 参数验证:确保模拟的
mockNewsRoom和实际业务中option.value的结构完全匹配,这样断言结果才会准确可靠。
你原来测试代码的问题修正
你原来代码里的comp.optionSelected)=()是错误写法,Angular组件的事件是通过emit方法来触发的,不是直接赋值函数。上面的示例已经修正了这个问题,直接调用emit传递符合事件结构的对象即可。
内容的提问来源于stack exchange,提问作者Snedden27
相关产品推荐
相关产品推荐

