如何为Prisma的groupBy方法编写Jest单元测试?
解决Prisma groupBy方法的Jest单元测试模拟问题
问题核心
Prisma的groupBy是泛型方法,直接使用mockResolvedValue会因类型不匹配报错,需要明确指定泛型参数并返回符合结构的Promise。
可行解决方案
1. 定义匹配结构的模拟数据
先写出和业务逻辑返回结构一致的测试数据:
const mockGroupByResult = [ { videoId: "video_1", _avg: { rating: 4.5 }, _count: 2 }, { videoId: "video_2", _avg: { rating: 3.0 }, _count: 1 } ];
2. 正确模拟groupBy方法
通过类型断言将groupBy标记为Jest Mock类型,再设置返回值:
test("get all ratings", async () => { const prismaMock = mockDeep<PrismaClient>(); // 手动断言为Jest Mock后,即可使用mockResolvedValue (prismaMock.rating.groupBy as jest.Mock).mockResolvedValue(mockGroupByResult); // 调用你的业务逻辑函数(假设函数名为getVideoRatingStats) const result = await getVideoRatingStats(prismaMock); // 验证结果和调用行为 expect(result).toEqual(mockGroupByResult); expect(prismaMock.rating.groupBy).toHaveBeenCalledWith({ by: ["videoId"], _avg: { rating: true }, _count: true }); });
3. 严格类型检查的写法(可选)
如果需要更严谨的类型校验,可以手动指定Prisma生成的groupBy输出类型:
import type { RatingGroupByOutputType } from "@prisma/client"; // 精准定义符合业务逻辑的返回类型 const mockGroupByResult: RatingGroupByOutputType<{ by: ["videoId"], _avg: { rating: true }, _count: true }>[] = [ { videoId: "video_1", _avg: { rating: 4.5 }, _count: 2 } ]; // 直接赋值为Jest Mock函数 prismaMock.rating.groupBy = jest.fn().mockResolvedValue(mockGroupByResult);
关键说明
- 无需修改业务逻辑中的
groupBy调用,仅在测试层做模拟即可。 - 类型断言
as jest.Mock是因为mockDeep生成的默认类型不会将方法标记为Jest Mock,手动断言后才能使用mockResolvedValue等Mock方法。
内容的提问来源于stack exchange,提问作者Bo Bramer
相关产品推荐
相关产品推荐

