aws-lambda - 模拟 Lambda.invoke 包装但未被调用
问题描述
我在尝试模拟lambda.invoke
我从另一个 lambda 函数中调用的函数时遇到问题。
- 函数被包装(我不能使用 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
引用handler.js
。您可以在处理程序函数内而不是在它之外添加该const lambda = new AWS.Lamda({})
行吗?
推荐阅读
- javascript - 使用 HTML/Javascript 中的下拉菜单显示列表
- github - 如何将我的 git 默认目录更改为 main
- http - 为 URL 的所有子目录提供默认页面
- javascript - IE11 兼容 Object.fromEntries
- python - tensorflow One Hot Encodings 的使用
- python - 接收交易数据以太坊错误TypeError:
- git - 为什么我不能使用 SSH 与 GitHub 交互
- python - 如何在没有 setIndexWidget 的情况下将 Widget 设置为 QAbstractTableModel 数据?
- vue.js - 如何转换日期字段以响应 vuejs 中的字符串,以便我可以根据其他列进行分组
- regex - 非贪婪的正则表达式不能像我想要的那样工作(记事本++ 8.1.1)