首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用aws-sdk-mock对DocumentClient的promise支持

使用aws-sdk-mock对DocumentClient的promise支持
EN

Stack Overflow用户
提问于 2017-02-25 00:29:34
回答 5查看 28.3K关注 0票数 16

我正在尝试使用aws-sdk-mock的promise支持来编写单元测试。我使用的是DocumentClient。

我的代码如下所示:

代码语言:javascript
复制
const docClient = new AWS.DynamoDB.DocumentClient();

const getItemPromise = docClient.get(params).promise();
   return getItemPromise.then((data) => {
   console.log('Success');
   return data;
}).catch((err) => {
   console.log(err);
});

我的模拟和单元测试如下所示:

代码语言:javascript
复制
const AWS = require('aws-sdk-mock');
AWS.Promise = Promise.Promise;

AWS.mock('DynamoDB.DocumentClient', 'get', function (params, callback)
{
   callback(null, { Item: { Key: 'test value } });
});

dynamoStore.getItems('tableName', 'idName', 'id').then((actualResponse) => {
  // assertions
  done();
});

运行我的单元测试,不返回我的测试值,它实际上绕过了我的模拟,并直接调用dynamoDb。我做错了什么?如何正确设置我的mock?

EN

回答 5

Stack Overflow用户

发布于 2017-04-04 00:32:43

从您的代码中看不清楚,但aws-sdk-mock有此注释

注意:需要在被测试的函数内部初始化AWS服务,以便模拟SDK方法

因此,下面的代码将无法正确模拟

代码语言:javascript
复制
var AWS      = require('aws-sdk');
var sns      = AWS.SNS();
var dynamoDb = AWS.DynamoDB();

exports.handler = function(event, context) {
  // do something with the services e.g. sns.publish 
}

但这将会

代码语言:javascript
复制
var AWS = require('aws-sdk');

exports.handler = function(event, context) {
  var sns      = AWS.SNS();
  var dynamoDb = AWS.DynamoDB();
  // do something with the services e.g. sns.publish 
}

请在此处查看更多信息https://github.com/dwyl/aws-sdk-mock#how-usage

票数 18
EN

Stack Overflow用户

发布于 2018-12-31 03:02:54

现在回答可能太晚了,但我也遇到了同样的问题,我偶然发现了这个问题。经过几次尝试,我找到了一个不涉及aws-sdk-mock而只涉及纯Sinon的解决方案,我希望分享它能对其他人有所帮助。请注意,DynamoDB客户端是在lambda之外创建的。

lambda本身看起来像这样:

代码语言:javascript
复制
const dynamoDB = new DynamoDB.DocumentClient();

exports.get = async event => {
    const params = {
        TableName: 'Tasks',
        Key: {
            id: event.pathParameters.id
        }
    };

    const result = await dynamoDB.get(params).promise();
    if (result.Item) {
        return success(result.Item);
    } else {
        return failure({ error: 'Task not found.' });
    }
};

这个lambda的测试是:

代码语言:javascript
复制
const sandbox = sinon.createSandbox();

describe('Task', () => {

    beforeAll(() => {
        const result = { Item: { id: '1', name: 'Go to gym'}};
        sandbox.stub(DynamoDB.DocumentClient.prototype, 'get').returns({promise: () => result});
    });

    afterAll(() => {
        sandbox.restore();
    });

    it('gets a task from the DB', async () => {
        // Act
        const response = await task.get(getStub);
        // Assert
        expect(response.statusCode).toEqual(200);
        expect(response.body).toMatchSnapshot();
    });
});

我喜欢使用Sinon的沙箱,以便能够在一个restore()中存根一大堆不同的DynamoDB方法并清理所有内容。

票数 16
EN

Stack Overflow用户

发布于 2019-05-10 17:09:36

可以使用sinonproxyquire来模拟dynamodb客户端。

它支持基于回调和基于异步/等待的调用。

有关完整的详细信息https://yottabrain.org/nodejs/nodejs-unit-test-dynamodb/,请参阅此链接

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42443655

复制
相关文章

相似问题

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