簡體   English   中英

Jest mock 無法拾取錯誤拋出?

[英]Jest mock unnable to pick up error throw?

我有一些調用 api 的代碼。 我正在測試嵌套在 try catch 中的功能,並在我拋出具有某些值的錯誤時檢查正確的行為。

async function createDeployment(namespace, config, name) {
  try {
    await k8sDeploymentApi.createNamespacedDeployment(namespace, config, true);
    console.log('Successful deployment');
    return Promise.resolve(true);
  } catch (e) {
    console.log(JSON.stringify(e));
    if (e.response.statusCode === HTTP_CONFLICT) {
      try {
        await k8sDeploymentApi.replaceNamespacedDeployment(name, namespace, config, true);
        console.log('Successfully replaced deployment');
        return Promise.resolve(true);
      } catch (error) {
        return Promise.reject(error);
      }
    }
    return Promise.reject(e);
  }
}

我是 mocking 出 api 在這里調用節點模塊

var mockListNamespacedIngress;
var mockCreateNamespacedDeployment;
var mockReplaceNamespacedDeployment;
jest.mock('@kubernetes/client-node', () => {
  mockListNamespacedIngress = jest.fn();
  mockCreateNamespacedDeployment = jest.fn();
  mockReplaceNamespacedDeployment = jest.fn();
  return {
    KubeConfig: jest.fn().mockImplementation(() => ({
      loadFromCluster: jest.fn(),
      loadFromDefault: jest.fn(),
      makeApiClient: () => ({
        listNamespacedIngress: mockListNamespacedIngress,
        createNamespacedDeployment: mockCreateNamespacedDeployment,
        replaceNamespacedDeployment: mockReplaceNamespacedDeployment,
      }),
    })),
  };
});

並在這里運行測試

    it.only('Should return a log of success if replaced deployment resolves', async () => {
      mockCreateNamespacedDeployment.mockRejectedValueOnce(() =>
        Promise.reject(new Error({ response: { statusCode: 409 } })),
      );

      mockReplaceNamespacedDeployment.mockResolvedValueOnce(true);

      // When
      await expect(createDeployment()).resolves.toEqual(true);
    });

但是在console.log(JSON.stringify(e)) 上,我只會得到未定義的回來。 所以它似乎確實拋出了錯誤,但從捕獲中沒有給出錯誤 object 。 這是我的完整堆棧跟蹤

 ● Kubernetes deployment script tests › Kubernetes Calls › Should return a log of success if replaced deployment resolves

    expect(received).resolves.toEqual()

    Received promise rejected instead of resolved
    Rejected to value: [TypeError: Cannot read property 'statusCode' of undefined]

      143 |
      144 |       // When
    > 145 |       await expect(createDeployment()).resolves.toEqual(true);
          |             ^
      146 |     });
      147 |   });
      148 |

      at expect (node_modules/expect/build/index.js:134:15)
      at Object.it.only (src/__tests__/index.test.js:145:13)

  console.log
    Successful deployment

      at createDeployment (src/index.js:73:13)

  console.log
    undefined

      at createDeployment (src/index.js:76:13)

您可以模擬異步 function 拋出這樣的錯誤

mockCreateNamespacedDeployment.mockRejectedValueOnce(new Error({ response: { statusCode: 409 } });

然后你可以期待

await expect(createDeployment()).rejects.toThrow();

順便說一句,在您的async function 中,您可以替換所有

- Promise.resolve(xxx)
+ return xxx

// and
- Promise.reject(xxx)
+ throw xxx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM