如何在 nodejs 上使用 DynamoDb 测试 await/async?
How to test await/async with DynamoDb on nodejs?
我使用 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;
})
});
但是主要有两个问题:
如果在处理程序之外创建 dynamoDb,Mock 将不起作用。我还有哪些其他选择?我能以某种方式使用 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;
});
});
我使用 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;
})
});
但是主要有两个问题:
如果在处理程序之外创建 dynamoDb,Mock 将不起作用。我还有哪些其他选择?我能以某种方式使用
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;
});
});