Javascript 测试异步SQS sendMessage
我有一个异步lambda,它执行一个异步SQS sendMessage请求。SQS队列是标准队列,不是FIFO,只是为了澄清 下面是一个代码示例(没有不相关的逻辑部分): 很简单 现在的问题是:我正试图使用包Javascript 测试异步SQS sendMessage,javascript,node.js,aws-lambda,amazon-sqs,aws-sdk-mock,Javascript,Node.js,Aws Lambda,Amazon Sqs,Aws Sdk Mock,我有一个异步lambda,它执行一个异步SQS sendMessage请求。SQS队列是标准队列,不是FIFO,只是为了澄清 下面是一个代码示例(没有不相关的逻辑部分): 很简单 现在的问题是:我正试图使用包awsdkmock测试这个函数。这就是我在lambda不异步且sendMessage函数正在使用回调时如何存根sendMessage函数的方法: it("an awesome title for my test", async () => { let payload = {
awsdkmock
测试这个函数。这就是我在lambda不异步且sendMessage函数正在使用回调时如何存根sendMessage函数的方法:
it("an awesome title for my test", async () => {
let payload = {
Records: [
// Data here
]
};
AWS.mock("SQS", "sendMessage", (param, callback) => {
let response = {
ResponseMetadata: {
RequestId: "test-request-id"
},
MD5OfMessageBody: "a892e8d8589e97ca92fb70020f01c16c",
MessageId: "test-message-id"
};
callback(null, response);
});
await app.functionHandler(payload, {}, (err, result) => {
let parsedBody = JSON.parse(result.body);
expect(parsedBody.message).to.be.equal("Done");
// More stuff
});
AWS.restore();
});
如果使用此测试,sendMessage函数将抛出以下错误:
sendMessage returned an invalid MD5 response. Got "undefined", expecting "a892e8d8589e97ca92fb70020f01c16c".
我不知道如何异步测试sendMessage。如果有助于我完成工作,我不介意采用不同的方案
有人能帮忙吗
非常感谢我没有使用aws sdk mock,但很明显,在您的mock中,您使用的是回调,而在lambda处理程序中,它是一个异步调用。我使用它来模拟依赖项。以下是一个例子: functionHandler.js 不需要在Lambda运行时
Node8.10
中使用回调
和上下文
let AWSSQS = require('aws-sdk/clients/sqs');
let sqs = new AWSSQS();
exports.functionHandler = async (event) => {
// No need to use callback when Lambda runtime is 8.10.
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();
return utils.respondSuccess('Done');
} catch (err) {
throw utils.respondError(err);
}
};
测试规范js
几乎不言自明。您可以将依赖项的名称定义为属性的对象
const proxyquire = require('proxyquire');
let app = require('path/to/function');
describe('SQS', () => {
it("an awesome title for my test", async (done) => {
const app = proxyquire(app, {
'aws-sdk/clients/sqs': function() {
this.sendMessage = (params) => {
return {
promise: () => {
return Promise.resolve({
ResponseMetadata: {
RequestId: 'test-request-id'
},
MD5OfMessageBody: 'a892e8d8589e97ca92fb70020f01c16c',
MessageId: 'test-message-id'
});
}
}
}
}
});
let payload = {
Records: [
// Data here
]
};
const data = await app.functionHandler(payload);
let parsedBody = JSON.parse(data.body);
expect(parsedBody.message).to.be.equal("Done");
done();
});
});
感谢您提供有关上下文/回调的提示。在实现proxyquire之后,我仍然会得到相同的错误。我也曾试图与sinon解决承诺问题,但sameI意识到我的代码有一些拼写错误。模拟方法应该是
this.sendMessage
。另外,我使用的是重新布线,而不是路径/到/函数的要求。我已经修复了这些问题,但不起作用,但现在我设法让它起作用。我的问题是需要不同的SQS(我需要sdk并从sdk实例化SQS,)。也许我在proxyquire中对它的适应不好。正如您所做的那样直接要求sqs,并在proxyquire中使用aws sdk/clients/sqs
,解决了我的问题。谢谢
const proxyquire = require('proxyquire');
let app = require('path/to/function');
describe('SQS', () => {
it("an awesome title for my test", async (done) => {
const app = proxyquire(app, {
'aws-sdk/clients/sqs': function() {
this.sendMessage = (params) => {
return {
promise: () => {
return Promise.resolve({
ResponseMetadata: {
RequestId: 'test-request-id'
},
MD5OfMessageBody: 'a892e8d8589e97ca92fb70020f01c16c',
MessageId: 'test-message-id'
});
}
}
}
}
});
let payload = {
Records: [
// Data here
]
};
const data = await app.functionHandler(payload);
let parsedBody = JSON.parse(data.body);
expect(parsedBody.message).to.be.equal("Done");
done();
});
});