在AWS Lambda中嘲弄
我有一个简单的AWS Node.js Lambda,我想用mocks来testing:
//SimpleLambda.js var AWS = require('aws-sdk'); exports.handler = function(event, context) { var name = getName(); context.succeed(name); }; function getName() { return 'David'; }
我已经安装了mocha
和simple-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); }); }); });
输出仍然build议getName
返回“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)
可以这样做吗?
你需要导出你的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'; }
尝试把simple.mock(lambda, 'getName').returnWith('Tim');
到beforeEach
并删除这个lambda.getName.returnWith('Tim');
。