내일배움캠프 TIL

nest에서의 jest기본 문법 본캠프 TIL 02/04

parkcw0325 2025. 2. 4. 22:12

이번에는 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는 다양한 기능을 제공하므로, 공식 문서를 참고하여 더 깊이 있는 학습을 진행해 보세요! 😊