You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:50:26