使用jest模拟需要初始化类的对象示例的第三方包方法

toiithl6  于 2023-03-16  发布在  Jest
关注(0)|答案(1)|浏览(154)

我想使用jest来模拟来自第三方包的方法'sendBatch':单元测试中的“messaging-api-messenger”。
我的代码:

// sendMessages.js
async function sendMessage () {
  const { MessengerClient } = require('messaging-api-messenger')
  const client = new MessengerClient({accessToken: 'accessToken'})
  return client.sendBatch([{message:'message', to:'someone'}]
}
module.exports = sendMessage()
// send.test.js
const Send = require('sendMessage')
const sendBatchMock = jest.fn().mockImplementation(() => {})
jest.mock('messaging-api-messenger', () => {
  return {
    MessengerClient: jest.fn().mockImplementation(() => ({
      sendBatch: sendBatchMock
    }))
  }
})
sendBatchMock.mockReturnValue({
  success: true,
  responseData: [{ code: 200, body: { } }]
})
it('send message' async () => {
  const sendResult = await Send.sendMessage()
  expect(sendResult).toEqual('what I want')
}

这是sendBatch实际返回的:

sendResult {
  success: true,
  responseData: [ { code: 400, headers: [Array], body: [Object] } ]
}

但我希望sendBatch返回以下内容:

sendResult {
  success: true,
  responseData: [ { code: 200, headers: [], body: {} } ]
}

如何模拟在sendMessage.js调用的sendBatch方法,并要求sendBatch方法返回我想要的特定值,然后检查返回值?

1l5u6lss

1l5u6lss1#

您的sendMessage函数未返回任何内容,因此sendResult变量在此测试中未定义:

const sendResult = await Send.sendMessage();
expect(sendResult).toEqual('what I want');

您可以从该函数返回,因此将具有:

async function sendMessage () {
  const { MessengerClient } = require('messaging-api-messenger')
  const client = new MessengerClient({accessToken: 'accessToken'})
  return client.sendBatch([{message:'message', to:'someone'}]
}

但这对测试没有意义

it('send message' async () => {
  const sendResult = await Send.sendMessage()
  expect(sendResult).toEqual('what I want')
}

你可能需要检查你调用的sendBatch是用正确的参数调用的。要做到这一点,请参考Jest Mocking文档。
你会得到这样的结果:

import { sendMessage } from "../sendMessages";
const sendBatchMock = jest.fn().mockImplementation(() => {});

jest.mock("messaging-api-messenger", () => {
  return {
    MessengerClient: jest.fn().mockImplementation(() => ({
      sendBatch: sendBatchMock,
    })),
  };
});

describe("my test", () => {
  it("should call my method with the correct parameters", async () => {
    await sendMessage();
    expect(sendBatchMock).toHaveBeenCalledWith([
      { message: "message", to: "someone" },
    ]);
  });
});

如果在模拟返回值后仍想检查结果:

it("should work as well", async () => {
  sendBatchMock.mockReturnValue("what I want");

  expect(await sendMessage()).toEqual("what I want");
  expect(sendBatchMock).toHaveBeenCalledWith([
    { message: "message", to: "someone" },
  ]);
});

相关问题