我正在尝试使用aws-sdk-mock的promise支持来编写单元测试。我使用的是DocumentClient。
我的代码如下所示:
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);
});我的模拟和单元测试如下所示:
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?
发布于 2017-04-04 00:32:43
从您的代码中看不清楚,但aws-sdk-mock有此注释
注意:需要在被测试的函数内部初始化AWS服务,以便模拟SDK方法
因此,下面的代码将无法正确模拟
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
}但这将会
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
}发布于 2018-12-31 03:02:54
现在回答可能太晚了,但我也遇到了同样的问题,我偶然发现了这个问题。经过几次尝试,我找到了一个不涉及aws-sdk-mock而只涉及纯Sinon的解决方案,我希望分享它能对其他人有所帮助。请注意,DynamoDB客户端是在lambda之外创建的。
lambda本身看起来像这样:
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的测试是:
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方法并清理所有内容。
发布于 2019-05-10 17:09:36
可以使用sinon和proxyquire来模拟dynamodb客户端。
它支持基于回调和基于异步/等待的调用。
有关完整的详细信息https://yottabrain.org/nodejs/nodejs-unit-test-dynamodb/,请参阅此链接
https://stackoverflow.com/questions/42443655
复制相似问题