Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 测试异步SQS sendMessage_Javascript_Node.js_Aws Lambda_Amazon Sqs_Aws Sdk Mock - Fatal编程技术网

Javascript 测试异步SQS sendMessage

Javascript 测试异步SQS sendMessage,javascript,node.js,aws-lambda,amazon-sqs,aws-sdk-mock,Javascript,Node.js,Aws Lambda,Amazon Sqs,Aws Sdk Mock,我有一个异步lambda,它执行一个异步SQS sendMessage请求。SQS队列是标准队列,不是FIFO,只是为了澄清 下面是一个代码示例(没有不相关的逻辑部分): 很简单 现在的问题是:我正试图使用包awsdkmock测试这个函数。这就是我在lambda不异步且sendMessage函数正在使用回调时如何存根sendMessage函数的方法: it("an awesome title for my test", async () => { let payload = {

我有一个异步lambda,它执行一个异步SQS sendMessage请求。SQS队列是标准队列,不是FIFO,只是为了澄清

下面是一个代码示例(没有不相关的逻辑部分):

很简单

现在的问题是:我正试图使用包
awsdkmock
测试这个函数。这就是我在lambda不异步且sendMessage函数正在使用回调时如何存根sendMessage函数的方法:

it("an awesome title for my test", async () => {
    let payload = {
        Records: [
            // Data here
        ]
    };

    AWS.mock("SQS", "sendMessage", (param, callback) => {
        let response = {
            ResponseMetadata: {
                RequestId: "test-request-id"
            },
            MD5OfMessageBody: "a892e8d8589e97ca92fb70020f01c16c",
            MessageId: "test-message-id"
        };

        callback(null, response);
    });

    await app.functionHandler(payload, {}, (err, result) => {
        let parsedBody = JSON.parse(result.body);
        expect(parsedBody.message).to.be.equal("Done");
        // More stuff
    });

    AWS.restore();
});
如果使用此测试,sendMessage函数将抛出以下错误:

sendMessage returned an invalid MD5 response. Got "undefined", expecting "a892e8d8589e97ca92fb70020f01c16c".
我不知道如何异步测试sendMessage。如果有助于我完成工作,我不介意采用不同的方案

有人能帮忙吗


非常感谢

我没有使用aws sdk mock,但很明显,在您的mock中,您使用的是回调,而在lambda处理程序中,它是一个异步调用。我使用它来模拟依赖项。以下是一个例子:

functionHandler.js

不需要在Lambda运行时
Node8.10
中使用
回调
上下文

let AWSSQS = require('aws-sdk/clients/sqs');
let sqs = new AWSSQS();

exports.functionHandler = async (event) => {

  // No need to use callback when Lambda runtime is 8.10.
  try {

    let parsedBody = JSON.parse(event.Records[0].body);
    let modifiedBody = await doStuff(parsedBody);

    let sqsPayload = {
      MessageBody: JSON.stringify(modifiedBody),
      QueueUrl: my-queue-url
    };

    await sqs.sendMessage(sqsPayload).promise();

    return utils.respondSuccess('Done');
  } catch (err) {
    throw utils.respondError(err);
  }
};
测试规范js

几乎不言自明。您可以将依赖项的名称定义为属性的对象

const proxyquire = require('proxyquire');

let app = require('path/to/function');

describe('SQS', () => {

  it("an awesome title for my test", async (done) => {

    const app = proxyquire(app, {
      'aws-sdk/clients/sqs': function() {
        this.sendMessage = (params) => {
          return {
            promise: () => {
              return Promise.resolve({
                ResponseMetadata: {
                  RequestId: 'test-request-id'
                },
                MD5OfMessageBody: 'a892e8d8589e97ca92fb70020f01c16c',
                MessageId: 'test-message-id'
              });
            }
          }
        }
      }
    });

    let payload = {
      Records: [
        // Data here
      ]
    };

    const data = await app.functionHandler(payload);
    let parsedBody = JSON.parse(data.body);
    expect(parsedBody.message).to.be.equal("Done");
    done();
  });
});

感谢您提供有关上下文/回调的提示。在实现proxyquire之后,我仍然会得到相同的错误。我也曾试图与sinon解决承诺问题,但sameI意识到我的代码有一些拼写错误。模拟方法应该是
this.sendMessage
。另外,我使用的是重新布线,而不是路径/到/函数的要求。我已经修复了这些问题,但不起作用,但现在我设法让它起作用。我的问题是需要不同的SQS(我需要sdk并从sdk实例化SQS,)。也许我在proxyquire中对它的适应不好。正如您所做的那样直接要求sqs,并在proxyquire中使用
aws sdk/clients/sqs
,解决了我的问题。谢谢
const proxyquire = require('proxyquire');

let app = require('path/to/function');

describe('SQS', () => {

  it("an awesome title for my test", async (done) => {

    const app = proxyquire(app, {
      'aws-sdk/clients/sqs': function() {
        this.sendMessage = (params) => {
          return {
            promise: () => {
              return Promise.resolve({
                ResponseMetadata: {
                  RequestId: 'test-request-id'
                },
                MD5OfMessageBody: 'a892e8d8589e97ca92fb70020f01c16c',
                MessageId: 'test-message-id'
              });
            }
          }
        }
      }
    });

    let payload = {
      Records: [
        // Data here
      ]
    };

    const data = await app.functionHandler(payload);
    let parsedBody = JSON.parse(data.body);
    expect(parsedBody.message).to.be.equal("Done");
    done();
  });
});