Angular中如何Spy第三方npm库的静态方法?报错排查
解决Angular测试中Spy第三方库静态属性方法的报错问题
在Angular服务中调用第三方npm库的CommonLogHelper.Logger.logException静态方法,尝试通过spyOn对该方法进行测试时,出现TypeError: Cannot read properties of undefined (reading 'logException')错误,核心原因是测试环境中CommonLogHelper.Logger静态属性未被初始化,处于undefined状态。
以下是两种可行的解决方案:
方案1:直接创建带Spy的Logger静态属性
在测试用例中,先为CommonLogHelper.Logger赋值一个包含Spy方法的对象,从根源避免undefined问题:
it('should log an exception with method name', () => { // 初始化Logger并创建logException的Spy CommonLogHelper.Logger = { logException: jasmine.createSpy('logException') }; const error = new Error('Test error'); const methodName = 'TestMethod'; loggerService.logException(error, methodName); expect(CommonLogHelper.Logger.logException).toHaveBeenCalledWith( error, methodName, 'Schedule Web Client' ); });
方案2:提前初始化Logger再Spy
在测试前置钩子中先初始化Logger静态属性,再使用spyOn拦截方法:
beforeEach(() => { // 重置并初始化Logger静态属性 CommonLogHelper.Logger = { logException: () => {} }; }); it('should log an exception with method name', () => { spyOn(CommonLogHelper.Logger, 'logException'); const error = new Error('Test error'); const methodName = 'TestMethod'; loggerService.logException(error, methodName); expect(CommonLogHelper.Logger.logException).toHaveBeenCalledWith( error, methodName, 'Schedule Web Client' ); });
关键说明
- 第三方库的静态属性在测试环境中不会自动初始化,必须手动赋值后才能对其方法进行Spy操作。
- 若使用Jest测试框架,将
jasmine.createSpy替换为jest.fn()即可适配。
内容的提问来源于stack exchange,提问作者Modern Viking
相关产品推荐
相关产品推荐

