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

Jasmine中spyOn监听npm包子模块方法报错未识别为spy问题求助

问题原因及修复方案

1. 直接错误:spy使用方式错误

Jasmine中spyOn(对象, 方法名)的返回值是被监听的方法对应的spy实例本身,不是包含该方法的父对象。
你代码中将spyOn(module.sub, 'subModuleMethod')赋值给moduleSpy后,moduleSpy就是subModuleMethod的spy实例,不需要再额外取.subModuleMethod属性,这也是你得到undefined的直接原因。
修复方式:把测试用例中的断言改为:

expect(moduleSpy).toHaveBeenCalled();

2. 其他潜在问题

  • 缺少交互触发与变更检测

你注释中提到点击按钮触发方法调用,但代码里没有实现触发点击、执行变更检测的逻辑,就算spy写法正确也会收到方法未调用的报错。需要在断言前补充对应逻辑:

// 示例:触发按钮点击
fixture.nativeElement.querySelector('button').click();
// 触发变更检测更新组件状态
fixture.detectChanges();
  • 第三方包导出只读导致spy失效

部分npm包的导出模块是冻结的只读对象,直接使用spyOn监听会静默失败。这种场景下建议配合你注入的TOKEN直接使用mock对象替换原依赖,更稳定可控:

import * as module from 'package';
import { TOKEN } from 'injectionToken.ts'

describe('ExampleComponent', () => {
    let component: ExampleComponent;
    let fixture: ComponentFixture<ExampleComponent>;
    // 直接创建spy
    let subModuleMethodSpy = jasmine.createSpy('subModuleMethod');

    beforeEach(async(() => {
        TestBed.configureTestingModule({
            // 注意原代码这里declarations后面少了冒号,属于语法错误也需要修正
            declarations: [ExampleComponent],
            providers: [
                { 
                    provide: TOKEN, 
                    // 直接传入mock的依赖对象
                    useValue: {
                        ...module,
                        sub: {
                            ...module.sub,
                            subModuleMethod: subModuleMethodSpy
                        }
                    }
                }
            ]
        }).compileComponents();
    }));

    beforeEach(() => {
        fixture = TestBed.createComponent(ExampleComponent);
        component = fixture.componentInstance;
    });

    it('test specific function call', () => {
        // 触发点击+变更检测
        fixture.nativeElement.querySelector('button').click();
        fixture.detectChanges();
        expect(subModuleMethodSpy).toHaveBeenCalled();
    });

})

内容的提问来源于stack exchange,提问作者john doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:15:07