如何使用Node.js和Mocha在另一个Lambda函数中模拟AWS Lambda函数调用

时间:2018-10-03 14:11:24

标签: node.js unit-testing aws-lambda mocha chai

我正在使用mocha和chai编写lambda函数(exports.handler)的单元测试。我正在编写单元测试的那个内部还有另一个lambda函数调用。

我不想调用对第二个lambda函数的实际调用。有什么方法可以模拟对此lambda函数的调用?

exports.handler = (event, context, callback) => {   
try {
  var lambda = new AWS.Lambda();    

   /*need to mock this lambda call*/                

   lambda.invoke({
   FunctionName: myFunction,
   Payload: payload}, function(error, data) {});
}
catch(e){
}

真的很感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

我同意@AironBrynchke使用一致的方法。由于您已经使用async/await,因此避免使用回调。

这就是我进行测试的方法。

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

exports.handler = async (event) => 
{
    try
    {
       const lambda = new AWS.Lambda();    

       await lambda.invoke(
       {
           FunctionName: 'whatever', // I changed it for test sample
           Payload: 'payload'
       }).promise();
    }
    catch (ex)
    {
        console.error(ex);
    }
};

并进行测试

const chai = require('chai');
const sinon = require('sinon');
const assert = chai.assert;
const proxyrequire = require('proxyquire');

const invokeStub = sinon.stub().returns({
  promise: sinon.stub().resolves()
});

// here we want to mock `Lambda` 
const src = proxyrequire('path-to-your-source-file', {
  'aws-sdk': {
    Lambda: sinon.stub().returns({
      invoke: invokeStub
    })
  }
});

describe('lambda test', function() {
  it('runs test', async function() {    
    await src.handler({});

    assert(invokeStub.calledWith({ FunctionName: 'whatever', Payload: 'payload' }));
  })
});

答案 1 :(得分:1)

首先,您要混合两种样式。如果您使用的是 try 和& catch 阻止,则:

exports.handler = async (event) => 
{
    try
    {
       const lambda = new AWS.Lambda();    

       await lambda.invoke(
       {
           FunctionName: myFunction,
           Payload: payload
       }).promise();
    }
    catch (ex)
    {
        console.error(ex);
    }
};

如何使用mochaJs测试lambda函数: 我可以提供一些参考,您可以自己找出适合您的情况。

  1. npm lib aws-lambda-mock-context(回调) 参考:https://github.com/SamVerschueren/aws-lambda-mock-context
  2. 另一个npm包lambda-tester(回调) 参考:https://www.npmjs.com/package/lambda-tester
  3. 看看stackoverflow上的嘲讽-aws-lambda 参考:Mocking in AWS Lambda