Prisma unit testing with mock

00_8_3·2022년 7월 25일
0

Migration To Prisma

목록 보기
6/11

적용 방법

prisma.ts

import { PrismaClient } from "@prisma/client";

const Prisma = new PrismaClient();


export default Prisma;

singleton.ts

singleton.ts 파일을 jest.config.ts의 setupFilesAfterEnv에 추가해야 됩니다.

import { mockReset, mockDeep, DeepMockProxy } from "jest-mock-extended";
import { PrismaClient } from "@prisma/client";
import Prisma from "../src/db/prisma";

jest.mock("../src/db/prisma", () => ({
  __esModule: true,
  default: mockDeep<PrismaClient>(),
}));

beforeEach(() => {
  // eslint-disable-next-line no-use-before-define
  mockReset(prismaMock);
});

export const prismaMock = Prisma as unknown as DeepMockProxy<PrismaClient>;

*.test.ts

...
const mock = prismaMock.내가만든스키마.findMany.mockResolvedValue(내가원하는결과);

const result = 모킹되는함수();

expect(mock).toHaveBeenCalled(); // mock 함수가 제대로 실행된다면 오류없이 됩니다.
expect(result).toEqual(mock);
...

이슈

기존 프로젝트는 typedi라는 라이브러리를 사용하여 DI를 적용 하였다.
코드 컨벤션을 준수하기 위해 Prisma라는 클래스를 만들어 기존에 사용되던 Mysql 의존성 주입을 대체하였다.

프리즈마 unit testing 방법은 2가지가 있는데
싱클톤 방법과 ctx가 있다.

ctx 방법을 선택할 경우 typedi를 전부 뜯어내야 하는 상황이라
싱클톤을 선택하였었다.

문제는 jest config의 setupFilesAfterEnv싱클톤.ts를 작성하면
기존의 typedi Service 함수가 주입되기전 jest가 실행되기 때문에
주입된 의존성을 찾지 못하는 오류가 나왔다.

해결하기 위해 typedi @Service로 제공하던 싱글톤을
직접 싱글톤으로 만들고 생성자에 넣어 주었다.

e.g

... //prisma.ts
const Prisma = new PrismaClient();

... //[].controller.ts
class asdfController {
	constructor() {
    	this.prisma = Prisma;
    }
}

0개의 댓글