이번에는 nest 에서 jest를 사용할때 사용할 수 있는 기본 문법에 대하여 기록하겠습니다.
자바스크립트에서도 사용은 가능하지만 차이점도 있습니다!
Jest 기본 문법 소개
Jest는 JavaScript 및 TypeScript 프로젝트에서 단위 테스트를 작성하고 실행하는 데 널리 사용되는 테스트 프레임워크입니다. Jest는 간단하면서도 강력한 문법을 제공하며, NestJS와 같은 프레임워크에서도 자주 사용됩니다. 아래에서는 Jest의 주요 문법과 활용 방법에 대해 설명합니다.
1. describe() 함수: 테스트 그룹화
describe() 함수는 관련된 테스트 케이스들을 하나의 그룹으로 묶어주는 역할을 합니다. 이를 통해 코드의 가독성을 높이고, 테스트 결과를 더 체계적으로 확인할 수 있습니다.
describe('User Service', () => {
it('should create a new user', () => {
// 유저 생성 테스트 로직
});
it('should return user details', () => {
// 유저 정보 조회 테스트 로직
});
});
위 예제에서 describe()는 "User Service"라는 이름으로 두 개의 테스트 케이스를 그룹화했습니다.
2. it() 또는 test(): 테스트 케이스 정의
it() 또는 test() 함수는 실제 테스트 케이스를 정의하는 데 사용됩니다. 두 함수는 동일한 기능을 수행하며, 스타일 차이만 있을 뿐입니다.
it('should return true for valid email', () => {
const email = 'test@example.com';
expect(validateEmail(email)).toBe(true);
});
test('should return false for invalid email', () => {
const email = 'invalid-email';
expect(validateEmail(email)).toBe(false);
});
위 예제에서는 이메일 유효성 검사를 테스트하는 두 가지 케이스를 작성했습니다.
3. beforeEach() 및 afterEach(): 테스트 준비 및 정리
- beforeEach() : 각 테스트 케이스가 실행되기 전에 실행되는 함수입니다. 주로 초기화 작업(예: 데이터 설정, 모듈 로드 등)에 사용됩니다.
- afterEach() : 각 테스트 케이스가 종료된 후 실행되는 함수입니다. 주로 정리 작업(예: 리소스 해제, 상태 초기화 등)에 사용됩니다.
let calculator;
beforeEach(() => {
calculator = new Calculator(); // 테스트 전 계산기 객체 초기화
});
afterEach(() => {
calculator.reset(); // 테스트 후 계산기 상태 초기화
});
it('should add two numbers correctly', () => {
expect(calculator.add(2, 3)).toBe(5);
});
it('should subtract two numbers correctly', () => {
expect(calculator.subtract(5, 3)).toBe(2);
});
4. expect() 및 매처(matcher) 함수: 테스트 결과 검증
expect() 함수는 테스트 대상 값을 전달하며, 반환된 객체는 다양한 매처(matcher) 함수를 포함합니다. 매처 함수는 테스트 결과를 평가하는 데 사용됩니다.
주요 매처 함수:
- toBe() : 값과 형식이 정확히 일치하는지 확인합니다.
- toEqual() : 객체나 배열의 내용이 동일한지 확인합니다.
- toContain() : 배열이나 문자열에 특정 요소가 포함되어 있는지 확인합니다.
- toBeTruthy() / toBeFalsy() : 값이 참인지 거짓인지 확인합니다.
- toBeGreaterThan() / toBeLessThan() : 값이 특정 숫자보다 크거나 작은지 확인합니다.
const fruits = ['apple', 'banana', 'cherry'];
// toBe(): 값과 형식이 정확히 일치하는지 확인
expect(1 + 1).toBe(2);
// toEqual(): 객체나 배열의 내용이 동일한지 확인
expect({ name: 'John' }).toEqual({ name: 'John' });
// toContain(): 배열에 특정 요소가 포함되어 있는지 확인
expect(fruits).toContain('banana');
// toBeTruthy(): 값이 참인지 확인
expect(true).toBeTruthy();
// toBeGreaterThan(): 값이 특정 숫자보다 큰지 확인
expect(10).toBeGreaterThan(5);
5. NestJS에서의 Jest 활용 예제
NestJS에서는 Jest를 사용하여 서비스, 컨트롤러, 파이프 등을 테스트할 수 있습니다. 아래는 UserService를 테스트하는 예제입니다.
예제: UserService 테스트
import { Test, TestingModule } from '@nestjs/testing';
import { UserService } from './user.service';
describe('UserService', () => {
let service: UserService;
// 테스트 모듈 설정
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [UserService],
}).compile();
service = module.get<UserService>(UserService);
});
// 서비스가 정의되었는지 확인
it('should be defined', () => {
expect(service).toBeDefined();
});
// 유저 생성 테스트
it('should create a new user', () => {
const newUser = { id: 1, name: 'John Doe', email: 'john@example.com' };
expect(service.createUser(newUser)).toEqual(newUser);
});
// 유저 조회 테스트
it('should find a user by id', () => {
const userId = 1;
const mockUser = { id: userId, name: 'John Doe', email: 'john@example.com' };
jest.spyOn(service, 'findUserById').mockReturnValue(mockUser);
expect(service.findUserById(userId)).toEqual(mockUser);
});
});
6. 추가 팁: Mocking
테스트 중 외부 API 호출이나 데이터베이스 접근을 피하기 위해 Jest의 Mocking 기능을 사용할 수 있습니다.
예제: Repository Mocking
const mockRepository = {
findOne: jest.fn(),
save: jest.fn(),
};
jest.mock('./user.repository', () => ({
getRepositoryToken: () => mockRepository,
}));
it('should call repository save method', async () => {
mockRepository.save.mockResolvedValue({ id: 1, name: 'John Doe' });
const result = await service.createUser({ name: 'John Doe' });
expect(mockRepository.save).toHaveBeenCalledWith({ name: 'John Doe' });
expect(result).toEqual({ id: 1, name: 'John Doe' });
});
마무리
위에서 설명한 Jest의 기본 문법과 NestJS에서의 활용 방법을 통해 단위 테스트를 작성할 수 있습니다. Jest는 다양한 기능을 제공하므로, 공식 문서를 참고하여 더 깊이 있는 학습을 진행해 보세요! 😊
'내일배움캠프 TIL' 카테고리의 다른 글
docker에 다해여 본캠프 TIL 02/07 (0) | 2025.02.07 |
---|---|
EFK란? 본캠프 TIL 02/05 (0) | 2025.02.05 |
모니터링 & 로깅 → EFK 스택 본캠프 TIL 02/03 (0) | 2025.02.03 |
LexoRank 를 적용하여 카드 순서 이동하기 본캠프 TIL 01/31 (0) | 2025.02.01 |
swagger와 본캠프 TIL 01/27 (0) | 2025.01.27 |