如何在Node.js上使用DynamoDb测试等待/异步?

奥雷斯特

我使用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;
  })
});

但是有两个主要问题:

  1. 如果在处理程序外部创建dynamoDb,则模拟无效。我还有什么其他选择?我可以sinon.stub以某种方式使用吗?

  2. 因为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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章