import { PrismaClient } from "@prisma/client";
const Prisma = new PrismaClient();
export default Prisma;
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>;
...
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로 제공하던 싱글톤을
직접 싱글톤으로 만들고 생성자에 넣어 주었다.
... //prisma.ts
const Prisma = new PrismaClient();
... //[].controller.ts
class asdfController {
constructor() {
this.prisma = Prisma;
}
}