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

如何使用Jest mock DynamoDB调用?附业务代码及测试用例

错误原因

你当前的测试写法存在3个核心问题:

  • getData是DynamoDBClient的实例成员方法,不是静态方法,直接使用jest.spyOn(DynamoDBClient, 'getData')无法匹配到实例上的方法
  • handler中是先new DynamoDBClient()创建实例再调用getData,你的mock逻辑没有覆盖实例创建后的方法绑定
  • 你的handler逻辑固定返回statusCode为200,但测试断言期望返回400,逻辑不匹配
正确实现方案

这里采用jest mock整个类的方案,是最通用的类实例方法mock方案:

  1. 首先在测试文件顶部mock你导入的DynamoDBClient模块:
// 路径替换为你实际存放DynamoDBClient类的文件路径
jest.mock('./src/utils/DynamoDBClient');
  1. 完整测试用例代码:
import DynamoDBClient from './src/utils/DynamoDBClient';
import { handler } from './src/handler';
import type { APIGatewayProxyEvent } from 'aws-lambda';

describe('DynamoDB', () => {
  test('should return no data', async () => {
    // 构造mock的getData方法,返回空对象
    const mockGetData = jest.fn().mockResolvedValue({});
    // mock类的实例化逻辑,让所有新创建的实例的getData都指向我们的mock方法
    (DynamoDBClient as jest.Mock).mockImplementation(() => ({
      getData: mockGetData
    }));

    // 构造测试用的API网关事件
    const mockEvent = {} as APIGatewayProxyEvent;
    const actual = await handler(mockEvent);

    // 校验调用参数符合预期
    expect(mockGetData).toHaveBeenCalledWith(123);
    // 校验返回值(这里和handler逻辑对齐返回200,如果你需要空数据返回400要先修改handler的判断逻辑)
    expect(actual).toEqual({
      statusCode: 200,
      body: JSON.stringify({})
    });
  });
});
额外注意点

你的getData方法定义接收的是string类型的id参数,但handler中调用时传入的是数字123,存在类型不匹配问题,建议统一参数类型。

内容的提问来源于stack exchange,提问作者kamlesh.bar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:27:03