如何为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
相关产品推荐
相关产品推荐

