You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:27:28