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

Jest单元测试中Mock NodeJS Kubernetes客户端get调用的最佳方案

错误原因

  • 第一是jest.mock的路径写错了,你把路径分隔符/写成了.,导致mock没有生效
  • 第二是你混淆了kubernetes客户端的属性和方法:调用链里的apis、apps、v1、deployments都是普通对象属性,不是可调用函数,不需要用jest.fn()定义。你之前把apis定义为函数,调用myClient.apis.apps时会读取函数对象上不存在的apps属性,自然返回undefined,触发无法读取v1的报错
  • 第三是调用链层级错误:get方法是namespaces('mynamespace')返回对象的deployments子属性下的方法,不是根客户端对象下的方法

正确Mock方案

直接按照实际调用的嵌套结构定义mock即可,代码如下:

const getClient = require('../utils/getClient')
// 修正路径错误
jest.mock('../utils/getClient')

// 用于捕获get调用、模拟返回结果
const mockGet = jest.fn()

// 因为getClient是异步函数,用mockResolvedValue直接返回Promise包裹的客户端对象
getClient.mockResolvedValue({
  apis: {
    apps: {
      v1: {
        // 只有namespaces是可调用方法,调用后返回带deployments的对象
        namespaces: jest.fn(() => ({
          deployments: {
            get: mockGet
          }
        }))
      }
    }
  }
})

如果你后续需要Mock其他资源(比如你代码里提到的buildconfigs),按照同样的嵌套结构补充对应属性即可。

使用示例

你可以按以下方式模拟返回值、验证调用:

// 模拟get接口返回的deployment列表
mockGet.mockResolvedValue({
  items: [
    { metadata: { name: 'test-deployment' } }
  ]
})

// 执行业务代码后验证调用是否符合预期
// 验证namespaces方法传入了正确的命名空间
expect(getClient.mock.results[0].value.apis.apps.v1.namespaces).toHaveBeenCalledWith('mynamespace')
// 验证get方法被调用
expect(mockGet).toHaveBeenCalled()

内容的提问来源于stack exchange,提问作者skålfyfan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:57:05