繁体   English   中英

Jest - 如何模拟 aws-sdk sqs.receiveMessage 方法

[英]Jest - How to mock aws-sdk sqs.receiveMessage methode

我尝试从 aws-sdk 导入的 mocking sqs.receiveMessage function。

这是我的代码(sqsHelper.js):

const AWS = require("aws-sdk");

export default class SqsHelper {


  static SqsGetMessagesTest = () => {

    const sqs = new AWS.SQS({
      apiVersion: serviceConfig.sqs.api_version,
      region: serviceConfig.sqs.region,
    });

    const queueURL =
      "https://sqs.us-west-2.amazonaws.com/<1234>/<4567>";

    const params = {
      AttributeNames: ["SentTimestamp"],
      MaxNumberOfMessages: 10,
      MessageAttributeNames: ["All"],
      QueueUrl: queueURL,
      VisibilityTimeout: 20,
      WaitTimeSeconds: 20,
    };


    return new Promise((resolve, reject) => {
      sqs.receiveMessage(params, async (recErr, recData) => {
        if (recErr) {
          reject(recErr);
        } else if (recData.Messages) {
          console.info(`Message count: ${recData.Messages.length}`);
          resolve(recData.Messages);
        }
      });
    });
  };
}

这是测试文件(sqsHelper.test.js):

import SqsHelper from "../../helpers/sqsHelper.js";
import { SQS } from "aws-sdk";

const dumyData = { Messages: [{ name: "123", lastName: "456" }] };
const sqs = new SQS();


describe("Test SQS helper", () => {

  test("Recieve message", async () => {

    jest.spyOn(sqs, 'receiveMessage').mockReturnValue(dumyData);

    // check 1
    const res1 = await sqs.receiveMessage();
    console.log(`res: ${JSON.stringify(res1, null, 2)}`)
    expect(res1).toEqual(dumyData);

    // check 2
    const res2 = await SqsHelper.SqsGetMessagesTest();
    console.log(`res2: ${JSON.stringify(res2, null, 2)}`);
    expect(res2).toBe(dumyData);

  });
});

问题是在第一次检查时(我直接从测试文件中调用 function)我可以看到 receiveMessage 已被模拟并且结果符合预期。

但是在第二次检查(function 从第二个模块“sqsHelper.js”中调用)看起来模拟 function doe 的工作和 originalreceiveMessage 已被调用,它仍然询问我有关凭据的信息。

这是错误:

InvalidClientTokenId: The security token included in the request is
invalid.

我做错了什么?

谢谢

receiveMessage应该触发参数中的回调。 receiveMessage不返回Promise尝试这样的事情:

const dummyData = { Messages: [{ name: "123", lastName: "456" }] };

const mockReceiveMessage = jest.fn().mockImplementation((params, callback) => callback("", dummyData));

jest.mock("aws-sdk", () => {
  const originalModule = jest.requireActual("aws-sdk");

  return {
    ...originalModule,
    SQS: function() { // needs to be function as it will be used as constructor
      return {
        receiveMessage: mockReceiveMessage
      }
    }
  };
})

describe("Test SQS helper", () => {
  test("Recieve message", async () => {
    const res = await SqsHelper.SqsGetMessagesTest();
    expect(res).toBe(dummyData.Messages);
  });

  test("Error response", async () => {
    mockReceiveMessage.mockImplementation((params, callback) => callback("some error"));
    await expect(SqsHelper.SqsGetMessagesTest()).rejects.toEqual("some error");
  });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM