Angular组件Jasmine测试Subject触发refresh函数时spyOnProperty报错
问题:测试Subject事件触发refresh函数时spyOnProperty报错
场景说明
组件里定义了一个Subject<void>类型的filterEvent,当这个Subject发送事件时,会调用组件的refresh()方法。现在要写单元测试验证refresh()确实会被调用,但用Jasmine的spyOnProperty()尝试替换filterEvent时,一直抛出错误。
组件代码
filterEvent = new Subject<void>();
测试代码
fit('refresh on filter events', fakeAsync(() => { const filterSub = new Subject<void>(); const filterEventSpy = spyOnProperty<any>(component, 'filterEvent', 'get').and.returnValue(filterSub); spyOn(component, 'refresh'); filterSub.next(); tick(500); expect(component.refresh).toHaveBeenCalled(); }));
错误信息
Error: <spyOnProperty> : Property filterEvent does not have access type get Usage: spyOnProperty(<object>, <propName>, [accessType]) Error: <spyOnProperty> : Property filterEvent does not have access type get Usage: spyOnProperty(<object>, <propName>, [accessType]) at <Jasmine>
解决方法
问题核心是:filterEvent是普通的实例属性,不是带getter的访问器属性,spyOnProperty()只适用于带有get/set访问器的属性,所以用它来替换普通属性会报错。
直接重新赋值组件的filterEvent属性就能解决问题,修改后的测试代码如下:
fit('refresh on filter events', fakeAsync(() => { // 创建新的Subject用于测试 const filterSub = new Subject<void>(); // 直接替换组件的filterEvent属性 component.filterEvent = filterSub; // 监听refresh方法 spyOn(component, 'refresh'); // 发送事件触发逻辑 filterSub.next(); tick(500); // 验证refresh被调用 expect(component.refresh).toHaveBeenCalled(); }));
如果组件在初始化阶段已经订阅了原有的filterEvent,替换属性后新的Subject会接管后续的事件发送,完全满足测试需求。
内容的提问来源于stack exchange,提问作者Dust_In_The_Wind
相关产品推荐
相关产品推荐

