我使用NodeJ来实现AWS Lambda函数,并想阐明什么是测试与DynamoDB集成的正确方法:
Lambda代码:
const AWS = require('aws-sdk');
AWS.config.update({region: region});
const dynamoDb = new AWS.DynamoDB();
exports.handler = async function(event, context) {
...
await dynamoDb.deleteItem(item).promise();
}
我将mocha, sinon, chai and aws-sdk-mock
用于测试:
const expect = require('chai').expect;
const AWS = require('aws-sdk-mock');
const lambda = require('../index.js');
const sinon = require('sinon');
describe('Test', function () {
let deleteItemSpy;
beforeEach(function () {
deleteItemSpy = sinon.spy();
AWS.mock('DynamoDB', 'deleteItem', deleteItemSpy);
}
it('valid call', async function() {
await lambda.handler({"id":1}, null);
expect(deleteItemSpy.calledOnce).to.be.true;
})
});
但是有两个主要问题:
如果在处理程序外部创建dynamoDb,则模拟无效。我还有什么其他选择?我可以sinon.stub
以某种方式使用吗?
因为await
从未收到来自lambda的结果,所以会引发超时。问题与spy
自身有关。我可能可以将其替换为:AWS.mock('DynamoDB', 'deleteItem', function (params, callback) { });
好吧,我知道了。不知道这是否是最好的方法,但是它可以工作。
const expect = require('chai').expect;
const AWS = require('aws-sdk');
const sinon = require('sinon');
describe('Test', function () {
let deleteItemStub;
let mockDynamoDb;
let lambda;
before(function() {
deleteItemStub = sinon.stub();
mockDynamoDb = sinon.stub(AWS, 'DynamoDB').callsFake(function() {
return {
deleteItem: deleteItemStub
};
});
lambda = require('../index.js');
});
after(function () {
mockDynamoDb.restore();
});
beforeEach(function () {
deleteItemStub.returns({ promise: () => Promise.resolve() });
});
afterEach(function () {
deleteItemStub.reset();
});
it('valid call', async function() {
await lambda.handler({"id":1}, null);
expect(deleteItemStub.calledOnce).to.be.true;
});
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句