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
相关产品推荐
相关产品推荐

