Prisma 2搭配NestJS spec测试报错:PrismaService不存在实体属性
问题排查与解决方案
这个报错既不属于NestJS/Prisma/Jest的兼容性问题,也大概率不是业务模块的导入导出异常,核心原因是Jest测试环境下未正确配置PrismaService的依赖,或是Prisma生成的类型没有被测试环境正确识别,可按以下步骤排查解决:
1. 确认Prisma生成配置与PrismaService定义正确
- 首先执行
npx prisma generate,确保schema.prisma中generator client配置正确,生成的PrismaClient类型已同步到node_modules/@prisma/client下。 - 确认自定义的PrismaService是继承了生成的PrismaClient,而非自定义的空类:
import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; @Injectable() export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy { async onModuleInit() { await this.$connect(); } async onModuleDestroy() { await this.$disconnect(); } }
2. 检查测试模块的提供者配置
Nest CLI自动生成的默认测试用例,不会自动引入业务外的依赖,你需要手动在测试的TestingModule中注册PrismaService或其mock实例:
import { Test, TestingModule } from '@nestjs/testing'; import { UserService } from './user.service'; import { PrismaService } from '../prisma/prisma.service'; describe('UserService', () => { let service: UserService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ UserService, // 直接引入真实PrismaService PrismaService, // 若需要mock隔离数据库,按下方写法配置即可,需覆盖所有用到的实体方法 // { // provide: PrismaService, // useValue: { // user: { // findUnique: jest.fn().mockResolvedValue({ id: 1, username: 'test' }), // } // } // } ], }).compile(); service = module.get<UserService>(UserService); }); it('should be defined', () => { expect(service).toBeDefined(); }); });
如果测试模块中未注册PrismaService,Jest会默认注入空的mock对象,自然找不到user、post这类实体属性。
3. 确认Jest的TS配置覆盖Prisma类型
检查根目录tsconfig.json与test/tsconfig.json的compilerOptions.include配置,确保包含PrismaService所在目录,且@prisma/client的类型能被正确识别。
内容的提问来源于stack exchange,提问作者Jordan Renaud
相关产品推荐
相关产品推荐

