Prisma 공식문서에는 단위 테스트 등을 수행할 때 PrismaClient를 모킹하는 방법에 대해 다소 복잡하게 설명하고 있다. 이게 Nestjs의 DI까지 고려하게되면 조금 머리 아파져서 일전에 시행착오를 많이 거쳤던 적이 있었고, 그래서 또 최근([TDD] 외부 라이브러리 테스트)에는 다소 manual하게 직접 모킹 객체를 만들어서 사용하기도 했다.
하지만 Prisma 공식문서에서도 소개하고 있는 jest-mock-extended
를 사용하여 비교적 더 간단하게 단위 테스트 내에서 Prisma의 동작을 모킹하는 방법이 있기에 소개한다.
pnpm add jest-mock-extended
import { mockDeep, DeepMockProxy } from 'jest-mock-extended';
import { PrismaClient } from '@prisma/client';
describe('UsersService', () => {
let service: UsersService;
let mockPrisma: DeepMockProxy<PrismaClient>;
...
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
UsersService,
PrismaService,
],
})
.overrideProvider(PrismaService)
.useValue(mockDeep<PrismaClient>())
.compile();
service = module.get<UsersService>(UsersService);
mockPrisma = module.get(PrismaService);
});
...
});
describe('Check user duplication', () => {
it('should return a User if user exists.', async () => {
mockPrisma.user.findUnique.mockResolvedValueOnce(testUser);
const where = { email: testUser.email };
const result = await service.findUserByEmail(where);
expect(result).toEqual(testUser);
});
it('should return null if user does not exist.', async () => {
mockPrisma.user.findUnique.mockResolvedValueOnce(null);
const where = { email: signupForm.email };
const result = await service.findUserByEmail(where);
expect(result).toBe(null);
});
});