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

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示例(缺少目标方法):
    const mockDeviceSecretService = {
      otherMethod: jest.fn()
    }
    
    修正后的mock示例:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:09:01