来自 kubernetes-client 的具体示例:
申请代码:
console.log(`Trying to create a namespace: ${namespaceName}`)
try {
await client.api.v1.namespaces(namespaceName).get()
} catch (err) {
try {
await client.api.v1.namespaces.post(namespaceJson)
} catch (err) {
console.log('Error creating namespace: ' + err)
return new Promise(function (resolve, reject) {
reject(new Error(`Failure creating namespace: ${namespaceName}: ${err}`))
})
}
...
测试:
jest.doMock('kubernetes-client', () => {
const aRejection = jest.fn(() => {
const err = new Error(404)
err.response = 'Not found'
err.status = 404
err.statusCode = 404
return Promise.reject(err)
})
const aPromise = jest.fn(() => {
return Promise.resolve({
body: {
data: {
username: 'dXNlcm5hbWUK' // 'username', base64-encoded
}
}
})
})
const namespaces = jest.fn().mockReturnValue({
get: aRejection,
post: aPromise
})
const mockClient = {
api: {
v1: {
namespaces
}
},
}
return {
Client: jest.fn(() => mockClient),
}
})
请注意,
client.api.v1.namespaces.post(namespaceJson)
(命名空间是一个对象)和client.api.v1.namespaces(namespace).get()
(命名空间是一个函数)都是有效的。
如果我将命名空间模拟为函数,则测试会失败,因为
client.api.v1.namespaces.post()
不是函数。
希望我只是在某个地方做错了什么,但我不知道那是什么。
这已经很旧了,但我刚刚在旧版本的 Axios 上遇到了类似的问题。希望这对其他人有帮助。
JS 中的函数仍然是可以为其分配 props 的对象,所以你应该能够做这样的事情
const namespaces = jest.fn().mockReturnValue({
get: aRejection,
post: aPromise
});
namespaces.post = jest.fn()
就我而言,我能够做这样的事情。
jest.mock('myModule', () => {
const module = jest.requireActual('myModule');
const mockAxios = jest.fn();
mockAxios.post = jest.fn();
return { ...module, mockAxios };
});
一个问题是我需要在模块模拟函数中重新声明mockAxios。您无法更改在模拟函数之外声明的任何变量的值,因此导入的mockedAxios是只读的。
这允许我在mockAxios和mockAxios.post上使用任何模拟函数并调用每个函数
mockAxios.mockReturnValue(mockData);
mockAxios.post.mockReturnValue(mockPostData);