在 AWS Lambda 中模拟

Mocking in AWS Lambda

我有一个简单的 AWS Node.js Lambda,我想使用模拟对其进行测试:

//SimpleLambda.js

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

exports.handler = function(event, context) {
  var name = getName();
  context.succeed(name);
};

function getName() {
  return 'David';
}

我已经安装了 mochasimple-mock,但是我无法让它工作:

//test.js

//Mocha
var assert = require('assert');
//Chai
var chai = require('chai');
var expect = chai.expect;
var should = chai.should();
//Simple-Mock
var simple = require('simple-mock');
//Lambda
var lambda = require('../SimpleLambda');

describe('SimpleLambda tests', function() {
  describe('Get name', function() {

    beforeEach(function() {
      simple.mock(lambda, 'getName');
    });

    it('should return \'Tim\' when the mocked with simple-mock', function() {
      lambda.getName.returnWith('Tim');

      var context = {
        invokeid: 'invokeid',
        succeed: function(result) {
          expect(result).to.equal("Tim");
          return result;
        }
      };

      lambda.handler({}, context);

    });
  });
});

输出仍然提示getNamereturns'David'

  SimpleLambda tests
    Get name
      1) should return 'Tim' when the mocked with simple-mock


  0 passing (11ms)
  1 failing

  1) SimpleLambda tests Get name should return 'Tim' when the mocked with simple-mock:

  AssertionError: expected 'Succesfully retrieved: David' to equal 'Tim'
  + expected - actual

  -Succesfully retrieved: David
  +Tim

  at Object.context.succeed (test/test.js:27:29)
  at Object.exports.handler (SimpleLambda.js:5:11)
  at Context.<anonymous> (test/test.js:32:14)

这可以做到吗?

尝试将 simple.mock(lambda, 'getName').returnWith('Tim'); 放入 beforeEach 并删除此 lambda.getName.returnWith('Tim');

您需要导出 getName 函数,以便可以从 test.js 访问它(并且可以被您的模拟库包装)。

像这样:

//SimpleLambda.js

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

exports.handler = function(event, context) {
 var name = exports.getName();
 context.succeed(name);
};

exports.getName = function (){
  return 'David';
}