Все сводится к нормализации в сравнении с простотой использования и проблемами производительности.
Если вы собираетесь придерживаться полных правил нормализации, вы закончите писать материал, который выглядит так:
Выберите c.id, c.lastname, ....... от клиента c левым join customerphonenumber cpn на c.id = cpn.customerid left join customeraddress ca на c.id = ca.customerid left join customerphonenumber2 cpn2 на c.id = cpn2.customerid и т. д. и т. д. и т. д.
Я не использовал aws-sdk-mock, но, видимо, в вашем макете вы используете обратный вызов, а в лямбда-обработчике это асинхронный вызов. Я использую proxyquire для пересмешивания зависимостей. Вот пример:
functionHandler.js
Не нужно использовать callback
и context
во время выполнения лямбды 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);
}
};
test.spec.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();
});
});