[Jest] Prisma mocking

아홉번째태양·2023년 6월 25일
0

Prisma 공식문서에는 단위 테스트 등을 수행할 때 PrismaClient를 모킹하는 방법에 대해 다소 복잡하게 설명하고 있다. 이게 Nestjs의 DI까지 고려하게되면 조금 머리 아파져서 일전에 시행착오를 많이 거쳤던 적이 있었고, 그래서 또 최근([TDD] 외부 라이브러리 테스트)에는 다소 manual하게 직접 모킹 객체를 만들어서 사용하기도 했다.

하지만 Prisma 공식문서에서도 소개하고 있는 jest-mock-extended를 사용하여 비교적 더 간단하게 단위 테스트 내에서 Prisma의 동작을 모킹하는 방법이 있기에 소개한다.

1. jest-mock-extended 설치

pnpm add jest-mock-extended

2. testingModule에 삽입

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);
  });
  
  ...
});

3. spyOn처럼 사용

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);
  });
});


참고
https://dev.to/afzal_s_h/comment/24ooo

0개의 댓글