我正在将NodeJs用于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;
})
});
所以有两个主要问题:
模拟不起作用。我还有什么其他选择?我可以以某种方式使用sinon.stub
吗?
由于await
从未收到过来自lambda的结果,因此引发了超时。问题与spy
本身有关。我可以将其替换为:AWS.mock('DynamoDB', 'deleteItem', function (params, callback) { });
答案 0 :(得分:2)
好吧,我知道了怎么做。不知道这是否是最好的方法,但是它是否有效。
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;
});
});