Как смоделировать вызов лямбда-функции aws внутри другой лямбда-функции с помощью nodejs и mocha - PullRequest
0 голосов
/ 03 октября 2018

Я пишу модульный тест для лямбда-функции (exports.handler) с mocha и chai.Есть еще один лямбда-вызов функции внутри того, который я пишу в модульном тесте.

Я не хочу вызывать реальный вызов второй лямбда-функции.Есть ли способы издеваться над вызовом этой лямбда-функции?

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 голосов
/ 07 октября 2018

Я согласен с @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' }));
  })
});
0 голосов
/ 03 октября 2018

Прежде всего, вы смешиваете два стиля.Если вы используете try && catch block, тогда:

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

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

Как протестировать вашу лямбда-функцию с помощью mochaJs: я могу предоставить несколько ссылок, и вы можете выяснить,самостоятельно, что вам подходит.

  1. npm lib aws-lambda-mock-context (обратные вызовы) ref: https://github.com/SamVerschueren/aws-lambda-mock-context
  2. еще один пакет npm lambda-tester (обратные вызовы) ref: https://www.npmjs.com/package/lambda-tester
  3. И взгляните на mocking-in-aws-lambda на stackoverflow ref: Пересмешивание в AWS Lambda
...