使用Middy时Jest测试失败,报错TypeError: callback is not a function求助
解决Middy封装Lambda后Jest测试报错"callback is not a function"
报错原因
Middy封装后的handler遵循Lambda执行协议,期望接收event、context(可选)和callback参数。直接无参调用getPartner()时,Middy内部terminate方法尝试调用不存在的callback,触发类型错误。
解决方案
方案1:按Lambda规范调用封装后的handler
测试时传入模拟的event和context参数(空对象即可,业务需要时补充字段),async类型的Lambda handler无需传callback,Middy会自动处理返回值:
修改测试代码:
describe('Partners', () => { describe('GET /partners', () => { test('should return partner list.', async () => { // 传入模拟的event和context const result = await getPartner({}, {}); const body = JSON.parse(result.body); expect(result.statusCode).toBe(httpStatus.OK); expect(body.data.length).toBe(1); }); }); });
方案2:抽离业务逻辑,单独测试纯函数
将核心业务逻辑从Middy封装中分离,测试时直接调用纯业务函数,专注验证业务逻辑,Middy中间件可在集成测试中验证:
修改handler文件:
// 抽离纯业务函数 async function getPartnerLogic(event) { // 原数据库调用等业务逻辑 } // 用Middy封装供Lambda使用 exports.getPartner = middy(getPartnerLogic);
测试文件调用纯函数:
describe('Partners', () => { describe('GET /partners', () => { test('should return partner list.', async () => { const result = await getPartnerLogic(); // 按需传入event参数 const body = JSON.parse(result.body); expect(result.statusCode).toBe(httpStatus.OK); expect(body.data.length).toBe(1); }); }); });
方案3:配置Middy禁用回调模式(Middy v3+适用)
如果使用Middy v3及以上版本,可通过配置强制使用Promise风格,避免回调依赖:
修改Middy封装代码:
module.exports = (fn) => { return middy(fn, { handler: { callbackWaitsForEmptyEventLoop: false } }) .use(jsonBodyParser()) .use(httpEventNormalizer()); };
内容的提问来源于stack exchange,提问作者Poor programmer
相关产品推荐
相关产品推荐

