NestJS · Unit Test

프로바이더 단위 테스트와 mock 경계

NestJS 단위 테스트는 TestingModule을 띄우는 형식보다, 테스트 대상 provider와 협력 provider를 분리해 도메인 규칙을 빠르게 검증하는 데 목적이 있다.

01

대상 고립

테스트할 service 하나를 정하고 외부 repository와 API client는 대체한다.

02

DI 구성

Test.createTestingModule에서 provider와 mock implementation을 주입한다.

03

시나리오 실행

성공, not found, conflict, validation 실패 같은 경로를 나눠 호출한다.

04

결과 검증

반환 DTO와 예외 타입, repository 호출 인자를 확인한다.

Service
도메인 규칙 중복 확인, 상태 전이, 계산 로직 검증
DB 없이 빠르게 실행
Repository mock
영속화 대체 findOne, save, update 결과를 시나리오별로 설정
ORM 동작 자체는 통합 테스트로
Exception
실패 계약 NotFoundException, ConflictException 등으로 실패 의미 고정
메시지 과고정 한계
Clock
시간 고정 만료, 예약, 생성 시각 로직을 안정적으로 검증
Date 직접 호출 줄이기

속도 · mock 의미 · exception assertion 점검

속도 DB와 네트워크 없이 빠르게 반복 실행된다.
mock 의미 외부 협력만 대체하고 대상 로직은 실제로 실행한다.
Exception assertion 프로바이더 단위 테스트와 mock 경계의 실패 조건을 따로 재현하지 않으면 권한, 설정, 응답 코드가 정상 예제 뒤에 숨어 운영 결함으로 남습니다.
DI 토큰 테스트에서 주입한 token이 실제 module의 token과 같다.

TestingModule 골격

const moduleRef = await Test.createTestingModule({
  providers: [OrdersService, { provide: OrdersRepo, useValue: repoMock }],
}).compile();