首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在nodejs上使用DynamoDb进行等待/异步测试?

如何在nodejs上使用DynamoDb进行等待/异步测试?
EN

Stack Overflow用户
提问于 2018-06-26 00:55:06
回答 1查看 3.4K关注 0票数 5

我使用NodeJs实现AWS函数,并希望阐明什么是测试与DynamoDB集成的正确方法:

Lambda代码:

代码语言:javascript
复制
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进行测试:

代码语言:javascript
复制
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) { });代替它
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-26 01:23:03

好吧我想明白了。不知道这是不是最好的方法,但有效。

代码语言:javascript
复制
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;
   });
});
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51033523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档