runWithMockContext란?
runWithMockContext는 Sonamu의 테스트 환경에서 격리된 Context를 제공하는 함수입니다. Sonamu는 AsyncLocalStorage를 사용하여 각 요청마다 독립된 Context를 유지하는데, 테스트에서도 동일한 메커니즘을 사용합니다.Context의 구성 요소
Mock Context는 다음과 같은 속성을 포함합니다:기본 사용법
일반 테스트 (비인증)
Sonamu에서 제공하는test() 함수는 자동으로 runWithMockContext를 실행합니다.
직접 사용하기
runWithMockContext를 직접 호출할 수도 있습니다:
인증된 사용자로 테스트하기
testAs() 사용
특정 사용자로 로그인한 상태를 시뮬레이션하려면testAs()를 사용합니다:
타입 안전성
testAs()는 제네릭을 지원하여 타입 안전성을 보장합니다:
실전 예제
Model 메서드 테스트
권한 검증 테스트
Context 속성 조작
특정 시나리오를 테스트하기 위해 Context 속성을 수정할 수 있습니다:test() vs testAs() 비교
- test()
- testAs()
비인증 테스트사용 시기:
- 인증이 필요 없는 공개 API 테스트
- 인증 여부와 무관한 로직 테스트
- Model의 기본 CRUD 작업 테스트
내부 구조
getMockContext()
Mock Context는 다음과 같이 생성됩니다:ip: 로컬 환경을 나타내는127.0.0.1session: 빈 객체로 초기화user: 기본값은null(비인증 상태)passport: Mock 함수로 실제 인증 로직은 실행되지 않음naiteStore: 각 테스트마다 독립된 로그 저장소
AsyncLocalStorage 격리
Sonamu는 Node.js의AsyncLocalStorage를 사용하여 Context를 격리합니다:
- 테스트 간 Context가 섞이지 않음
- 병렬 테스트 실행 시에도 안전
- 각 테스트는 독립된 Naite 로그 저장소를 가짐
test() 래퍼의 작동 원리
Sonamu의test() 함수는 Vitest의 test()를 래핑하여 자동으로 Mock Context를 제공합니다:
- Vitest의
test()실행 runWithMockContext()로 Mock Context 생성 및 활성화- 테스트 함수 실행
- 성공/실패 여부와 무관하게 Naite 로그 수집
- Context 자동 정리
testAs() 구조
testAs()는 사용자 정보를 추가로 받아 Context를 확장합니다:
