如何开玩笑地模拟可调用对象?

问题描述 投票:0回答:1

来自 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()
不是函数。

希望我只是在某个地方做错了什么,但我不知道那是什么。

node.js jestjs mocking
1个回答
0
投票

这已经很旧了,但我刚刚在旧版本的 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);
© www.soinside.com 2019 - 2024. All rights reserved.