【发布时间】:2021-10-08 22:49:00
【问题描述】:
我在尝试模拟从另一个 lambda 函数中调用的 lambda.invoke 时遇到问题。
- 函数被包裹(之后我不能使用 sinon,它会告诉我它已经被包裹了)。
- 测试一直在 AWS 上调用 lambda 函数,而不是调用 mock。
- 如果我使用 sinon 而不是 aws-sdk-mock,效果会一样。
test.js
const { handler1 } = require('../handler');
const sinon = require('sinon');
const AWSMock = require('aws-sdk-mock');
describe('invoke', () => {
beforeEach(() => {
invokeMock = jest.fn();
AWSMock.mock('Lambda', 'invoke', invokeMock);
// const mLambda = { invoke: sinon.stub().returnsThis(), promise: sinon.stub() };
// sinon.stub(AWS, 'Lambda').callsFake(() => mLambda);
});
afterEach(() => {
AWSMock.restore();
sinon.restore();
});
test('test1', async () => {
const event = { test: 'ok'};
const handler = await handler1(event);
expect(handler.statusCode).toBe(204);
});
});
而我的 lambda 函数是:
handler.js
const AWS = require('aws-sdk');
module.exports.handler1 = (event) => {
// The initialisation bellow has to be in the handler not outside.
const lambda = new AWS.Lambda({
region: 'us-west-2' //change to your region
});
let params = {
InvocationType: 'Event',
LogType: 'Tail',
FunctionName: 'handler2', // the lambda function we are going to invoke
Payload: JSON.stringify(event)
};
return new Promise((resolve, reject) => {
lambda.invoke(params, function(error, data) {
if(error) return reject(error);
const payload = JSON.parse(data.Payload);
if(!payload.success){
return resolve({ statusCode: 400});
}
return resolve({ statusCode: 204});
});
});
};
编辑:所以我遇到的问题是因为我在处理程序外部而不是在内部进行了 lambda 初始化 (const lambda = new AWS.Lambda({}))。感谢 stijndepestel 的回答。
【问题讨论】:
-
你是如何初始化
lambda的?
标签: aws-lambda mocking es6-promise sinon aws-sdk-mock