我正在尝试使用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);
});
Run Code Online (Sandbox Code Playgroud)
我的模拟和单元测试看起来像这样:
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();
});
Run Code Online (Sandbox Code Playgroud)
运行我的单元测试,不返回我的测试值,它实际上绕过我的模拟,并直接调用dynamoDb.我究竟做错了什么?我怎样才能正确设置模拟器?
首先,我没有使用 lambda,所以我相信这个线程不是同一个问题。
我在钩子中收到此错误before:
TypeError: Attempted to wrap undefined property S3 as function
at checkWrappedMethod (node_modules/aws-sdk-mock/node_modules/sinon/lib/sinon/util/core.js:78:29)
at Object.wrapMethod (node_modules/aws-sdk-mock/node_modules/sinon/lib/sinon/util/core.js:121:21)
at Object.stub (node_modules/aws-sdk-mock/node_modules/sinon/lib/sinon/stub.js:67:26)
at mockService (node_modules/aws-sdk-mock/index.js:67:27)
at Object.AWS.mock (node_modules/aws-sdk-mock/index.js:43:5)
at Context.<anonymous> (myModule.spec.js:14:9)
Run Code Online (Sandbox Code Playgroud)
我以前从未使用过这个模块,对 sinon.js 也没有太多经验。
这是我的模块:
var AWS = require('aws-sdk')
const https = require('https')
module.exports = function () {
var s3 = new AWS.S3({
httpOptions: {
agent: new https.Agent()
},
signatureVersion: 'v4'
})
return s3.getObject({Bucket: 'somebucket', Key: 'somekey'}).promise()
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试脚本:
const chai = require('chai')
const chaiAsPromised = require('chai-as-promised') …Run Code Online (Sandbox Code Playgroud) 我有一个异步 lambda,它执行异步 SQS sendMessage 请求。SQS 队列是标准队列,不是 FIFO,只是为了澄清。
这是一个代码示例(没有不相关的逻辑部分):
exports.functionHandler = async (event, context, callback) => {
try {
let parsedBody = JSON.parse(event.Records[0].body);
let modifiedBody = await doStuff(parsedBody);
let sqsPayload = {
MessageBody: JSON.stringify(modifiedBody),
QueueUrl: my-queue-url
};
await sqs.sendMessage(sqsPayload).promise();
callback(null, utils.respondSuccess("Done"));
} catch (err) {
// Handle error
callback(null, utils.respondError(err));
}
};
const doStuff = async payload => {
// Do stuff
}
Run Code Online (Sandbox Code Playgroud)
很简单。
现在的问题是:我正在尝试使用包来测试这个功能aws-sdk-mock。当 lambda 不是异步的并且 sendMessage 函数正在使用回调时,这就是我如何存根 sendMessage 函数:
it("an awesome title for my test", async () …Run Code Online (Sandbox Code Playgroud) 我尝试使用 aws-sdk-mock 和下面的代码来模拟 AWS SSM,但不起作用。不抛出错误,从实际存储中获取值getParametersByPath调用时从实际存储中获取值。
我查看了 aws-sdk-mock 文档,但似乎没有模拟 ssm 的示例,是否支持。
AWSMock.mock('SSM', 'getParametersByPath', (params, callback) => {
callback(null, mockResponse);
});
Run Code Online (Sandbox Code Playgroud) aws-sdk-mock ×4
node.js ×3
aws-sdk ×2
amazon-sqs ×1
aws-lambda ×1
javascript ×1
jestjs ×1
ssm ×1