1. 모듈(Module)
자바스크립트에서 모듈이란 어떤 코드를 다른 JS 파일에서 불러오기 편하도록 하나의 파일에 모아둔 것 입니다.
프로젝트가 커질수록 모든 JS 코드를 하나의 파일에 두기 어렵기 때문에, 자연스럽게 코드가 여러 JS 코드로 나눠지게 됩니다. (기능에 따라 모듈을 나눌 경우, 유지보수 및 코드 이해가 편하기 때문에 모듈을 나눠 작성할 것을 권장합니다.)
- NestJS에서 모듈은 대부분 다른 모듈에서 아래와 같이 import 키워드를 통해 불러내어 사용하게 됩니다.
import { UsersService } from './users.service'
2. TestingModule
NestJS에서 제공하는 @nestjs/testion 패키지를 사용하면 테스트에 사용되는 종속성만 선언해서 모듈을 만들고 해당 모듈로 Service와 Repository를 가져올 수 있습니다.
import { Test, TestingModule } from '@nestjs/testing'
describe('UsersService', () => {
let usersService: UsersService.
let userRepository: MockRepository<User>
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
UsersService
{ provide: getRepositoryToken(User), useValue: MockRepository() },
],
}).compile()
usersService = module.get<UsersService>(UsersService)
userRepository = module.get(getRepositoryToken(User))
})
위 코드와 같이 NestJS는 Test,createTestingModule() 함수를 사용해서 테스트 모듈을 설정할 수 있습니다. 이 함수에는 테스트 환경을 구성하기 위해 필요한 모듈과 서비스를 등록합니다. 이를 통해 각 테스트 케이스에서 필요한 모듈, 서비스, 레포지토리에 쉽게 접근할 수 있습니다.
- providers 배열에 등록된 Service와 Repository를 제공하며, providers 배열로 TestingModule에서 사용되는 모든 Service와 Repository의 의존성을 설정합니다. 이에 등록된 Service와 Repository는 테스트 동안 주입될 수 있습니다.
- .complie()을 활용해 Testing 모듈을 컴파일 함으로써, TestingModule은 설정된 모듈과 서비스를 컴파일하여 테스트가 가능한 모듈로 만듭니다.
usersService = module.get<UsersService>(UsersService)
userRepository = module.get(getRepositoryToken(User))
module.get<UsersService>(UsersService) 를 사용하여 UsersService의 인스턴스를 가져올 수 있습니다. 이렇게 작성 함으로서 usersService 변수가 UsersService의 인스턴스를 참조하게 됩니다.
jest.spyOn(usersService, 'findUserByUserId').mockResolvedValue(user)
위와 같은 방식으로 usersService에 정의되어 있는 함수를 참조할 수 있습니다.
- spyOn() 함수는 Jest에서 제공하는 spy 기능으로, 주어진 객체의 메서드를 spy 하여 호출 및 반환 값을 추적하거나 원하는 대로 재정의 할 수 있게 하는 기능을 제공합니다.
결과적으로 위의 코드는 userService 객체의 findUserByUserId()라는 메서드를 스파이 하고 추적합니다. 그리고 mockResolvedValue(user)을 통해 해당 메서드가 호출될 때 항상 user 값을 반환하도록 설정합니다.
이렇게 함으로써 테스트 코드에서 usersService.findUserByUserId를 호출할 때 실제로는 스파이 된 메서드가 호출되고 설정된 반환 값(user)이 반환됩니다. 이를 통해 테스트 중에 원하는 동작을 가로채거나 확인할 수 있습니다.
처음으로 NestJS의 테스트 코드를 작성해보며, 적은 글 입니다. 혹시 잘못된 부분이 있다면 댓글로 친절하게 알려주세요. 😀
'NestJS > jest (테스트 코드)' 카테고리의 다른 글
[NestJS] Jest 단위 테스트 - toBeCalled / toHaveBeenCalled (0) | 2023.06.13 |
---|---|
[NestJS] Jest 단위 테스트 - toBe / toEqual (0) | 2023.06.13 |
[NestJS] Jest 단위 테스트 - Mocking (1) | 2023.06.12 |