이전 글에선 컨트롤러에대한 단위테스트 작성하는법을 기록했는대 이번엔
서비스 계층의 단위테스트를 작성하는방법중 나를 8시간동안 고통받게했던 트랜잭션부분을 정리해볼려고한다
먼저 단위테스트를 작성하기전 제일먼저 알아야할것은 내가 어떤 방식으로 트랜잭션을 사용하고있는지를
인지를 하고있어야한다
이번에 트랜잭션을 처음써보는 바람에 방식에대해 이해를 하지 못한상태로 작업을 진행할려고하니
답이없는 상황이 수도없이 생긴다
먼저 내가 사용한 방법은 ```QueryRunner 를 사용한 방식인대,
이것을 인지하지 못한상태로 관련문서와 스택오버플로우 에서 Conncection을 사용하는 트랜잭션문서만 보다
계속 틀린길 로 빠진거같다
Service 는 Controller 와 달리 Repository 에 접근해야하는 일이 많기 때문에
Mocking 된 Repository를 먼저 생성해줘야 하고 그에 응하는 기본 문법을 적용시켜줘야한다
mockRepository 객체의 안을보면 create: jest.fn() / save:jest.fn() 과 같은 것들을 볼수있는대
이것들은 실제 Service 파일에서 사용하는 함수들을 여기서 jest.fn 을 이용해 모킹된 함수를 생성하는 작업을 하는것이다
그다음 사용할 서비스와 QueryRunner를 사용했기때문에 DataSource 에대한 선언을 먼저 해주어야한다
코드를 보면 아까 생성한 mockRepository 들의 대한 타입들도 정의해준것들을 볼수있다.
그 다음 실제 Service 파일들과 동일한 환경을 만들기위해 ##가짜모듈 을 생성한 후 그에 맞는 DI를 해주어야한다
그 다음 방금 생성한 ##가짜모듈 에서 생성해주는 service와 datasource같은 것들을 불러와주는 작업을 진행한다
그 다음 beforeEach 라는걸 작성해줄건대
beforeEach는 단위 테스트를 작성할 때 각 테스트가 실행되기 전에 특정 동작을 수행하도록 설정하는 데 사용되고, 이는 테스트 환경을 설정하고 초기화하거나, 각 테스트가 독립적으로 실행될 수 있도록 상태를 재설정하는 데 유용하다.
이렇게 실제 트랜잭션을 사용할때처럼 설정을 해주었다.
그다음 GIVEN/WHEN/THEN 같은 단위테스트를 진행할 로직을 구현하면 끝이다.
마지막으로 정말 중요한건, expect 를 통해 테스트를 진행할때. 어떤 테스트를 진행할지 모른다면
jest 공식문서를 읽어보면서 입맛대로 써먹는걸 추천한다.
'NestJs' 카테고리의 다른 글
NestJs 환경에서 faker (더미데이터 w/ seeder) 사용하기 (0) | 2024.07.19 |
---|---|
SSE (0) | 2024.07.19 |
Controller.spec.ts 에 테스트코드 작성해보기 (0) | 2024.07.15 |
Swagger (0) | 2024.07.10 |
ValidationPipe 에 대해 (1) | 2024.07.09 |