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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:23:19