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

如何为aws-sdk-mock模拟的AWS Lambda指定实际对应的业务代码

解决方案

你当前的写法存在逻辑错误:在invoke的模拟回调中再次实例化AWS.Lambda触发调用会进入死循环,完全不需要这么操作。

你要实现同项目Lambda函数的模拟调用,直接按以下步骤调整即可:

步骤1:导入本地目标handler

直接在测试文件中引入你要模拟的Lambda对应的handler方法:

import { handler } from './lambda' // 替换为你实际的lambda文件路径

步骤2:调整mock逻辑,关联本地handler

aws-sdk-mock的mock方法的第三个参数就是自定义的invoke实现,你只需要在这个实现里调用本地的handler,再将返回结果包装成真实Lambda invoke的返回格式即可。

以下是完整的修正后测试代码:

import AWSMock from "aws-sdk-mock"
import AWS from "aws-sdk"
import { handler } from './lambda' // 导入本地Lambda的handler

beforeAll(async (done) => {
  AWSMock.setSDKInstance(AWS)
  // get requires env vars
  done()
})

// 测试结束后恢复mock,避免影响其他用例
afterAll(() => {
  AWSMock.restore()
})

describe("Calling lambda", () => {
  it("should reject API call because of missing arguments", async () => {
    // 模拟Lambda.invoke方法
    AWSMock.mock("Lambda", "invoke", async (params) => {
      // 从invoke的参数中取出调用Lambda时传入的事件
      const event = JSON.parse(params.Payload as string)
      // 直接调用本地handler执行逻辑
      const handlerRes = await handler(event, {} as any, () => {})
      // 包装成真实Lambda invoke返回的结构
      return {
        StatusCode: 200,
        Payload: JSON.stringify(handlerRes)
      }
    })

    // 这里写你的业务逻辑调用代码,比如你要测的代码里会调用Lambda
    // 示例:
    const lambda = new AWS.Lambda()
    const invokeRes = await lambda.invoke({
      FunctionName: 'lambda',
      Payload: JSON.stringify({}) // 传空body触发缺少参数的场景
    }).promise()
    const resBody = JSON.parse(invokeRes.Payload as string)
    
    // 断言结果符合预期
    expect(resBody.statusCode).toBe(400) // 替换为你实际预期的错误状态码
  })
})

注意事项

  • 如果你需要模拟Lambda调用报错的场景,直接在mock的invoke实现里throw对应错误即可
  • 如果你的Lambda支持异步调用,只需要调整返回的结构加上对应字段即可,和真实AWS返回格式保持一致即可
  • 如果测试多个不同FunctionName的Lambda,可以在mock实现里判断params.FunctionName,调用对应不同的本地handler

内容的提问来源于stack exchange,提问作者Fares

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:57:03