오늘 시간을 마구 날려버리게한 prisma의 transaction을 jest로 테스트하는 과정을 포스팅하려 한다.
이것 저것 시도하다보니 시간을 많이 허비하였다.
첫 번째로는 mockPrisma 리스트에 $transaction을 추가하여 사용했는데,
트랜잭션 내부에 있는 prisma를 인식하지 못하여 실패하였다.
두 번째로는 트랜잭션의 매개변수 tx를 mock으로 선언해주고 트랜잭션 내부에 있는 모든 tx를 사용하는 객체의 반환값을 지정해주었는데 또 실패.
결국 첫 번째와 두 번째 방법에서 조금씩만 변형하여 이 둘레를 벗어나지 못하였다.
그러다가 발견한 spyOn..
우선 이 방법이 올바른 방법이라고 자신하지 않으므로 반박 시 여러분들 말이 다 맞다.
트랜잭션은 mockPrisma 리스트에 추가하여 사용하고 그 뒤 spyOn을 사용해준다.
// 예시 mockPrisma.menus.findMany.mockResolvedValue(menu); mockPrisma.$transaction.mockResolvedValue(order); jest.spyOn(mockPrisma, '$transaction').mockImplementation((callback) => { return callback(mockPrisma) }) mockPrisma.orders.create.mockResolvedValue(order);
이처럼 spyOn 메소드를 사용해준 후에 트랜잭션 내부에 있는 prisma에 접근하면
정상적으로 테스트를 통과하게 된다!
위는 $transaction을 mockPrisma로 새롭게 정의해주어 사용하는 방법으로,
spyOn을 사용하기 전의 mockPrisma와 이후의 mockPrisma는 서로 다르다고 생각하면 된다.
jest.spyOn() 은 테스트하는 함수 내부에서 호출되는 함수가 제대로 호출되었는지, 어떻게 호출되었는지를 확인하는 용도로 사용되는 함수이다.
여기에 mockImplementation() 를 이용하면 단순히 Mock 함수를 만들어 고정된 값을 반환하는 것이 아니라, 실제 호출하는 것과 동일하게 호출되는 Mock 함수를 만들수 있다.