如何使用Jest mock DynamoDB调用?附业务代码及测试用例
错误原因
你当前的测试写法存在3个核心问题:
getData是DynamoDBClient的实例成员方法,不是静态方法,直接使用jest.spyOn(DynamoDBClient, 'getData')无法匹配到实例上的方法- handler中是先
new DynamoDBClient()创建实例再调用getData,你的mock逻辑没有覆盖实例创建后的方法绑定 - 你的handler逻辑固定返回statusCode为200,但测试断言期望返回400,逻辑不匹配
正确实现方案
这里采用jest mock整个类的方案,是最通用的类实例方法mock方案:
- 首先在测试文件顶部mock你导入的DynamoDBClient模块:
// 路径替换为你实际存放DynamoDBClient类的文件路径 jest.mock('./src/utils/DynamoDBClient');
- 完整测试用例代码:
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
相关产品推荐
相关产品推荐

