Jest+Nest单元测试报Cannot spyOn on a primitive value错误如何解决?
报错根因
你遇到的Cannot spyOn on a primitive value; undefined given报错,本质是jest.spyOn方法接收的第一个参数(此处为service)是undefined,或者第二个参数对应的方法(此处为createCredentials)在service对象上不存在。
排查解决步骤
- 首先确认测试文件中
service实例已正确初始化
标准的Nest单测初始化逻辑如下,检查是否漏写了service = module.get<DeviceSecretService>(DeviceSecretService)赋值语句,这是该报错最常见的触发原因:import { Test, TestingModule } from '@nestjs/testing'; import { DeviceSecretService } from './device-secret.service'; let service: DeviceSecretService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [DeviceSecretService], // 若service有注入其他依赖,需在此处声明对应provider或其mock实现 }).compile(); service = module.get<DeviceSecretService>(DeviceSecretService); }); - 检查
DeviceSecretService类中createCredentials方法的定义- 确认方法名拼写完全一致,大小写不要出错
- 不要将方法声明为私有属性(
private修饰的方法spyOn无法直接访问,若为私有方法可调整访问权限,或直接在mock对象中定义该方法)
- 若你使用了自定义的mock service,确认mock对象已包含
createCredentials方法
错误的mock示例(缺少目标方法):
修正后的mock示例:const mockDeviceSecretService = { otherMethod: jest.fn() }const mockDeviceSecretService = { otherMethod: jest.fn(), createCredentials: jest.fn() // 必须声明目标方法 } - 若以上步骤均排查无问题,可在spyOn语句前加打印语句确认值的状态:
console.log('service实例:', service); console.log('createCredentials属性:', service?.createCredentials);
测试用例优化建议
- 你当前的测试用例没有异步逻辑,不需要加
async修饰符,避免不必要的隐式问题 - 若不需要执行
createCredentials的原逻辑,可在spyOn时添加mock实现屏蔽原方法执行,减少外部依赖干扰:const createCredentialsSpy = jest.spyOn(service, 'createCredentials').mockImplementation(() => null);
内容的提问来源于stack exchange,提问作者sweta singh
相关产品推荐
相关产品推荐

