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

