자바스크립트로 작성된 NestJS 앱의 테스트 주도 개발(TDD)

테스트 주도 개발(Test-Driven Development, TDD)은 소프트웨어 개발 방법론 중 하나로, 개발자는 테스트 케이스를 먼저 작성하고 이를 통과하는 코드를 작성하는 방식입니다.

NestJS는 Node.js를 기반으로 한 프레임워크로, 테스트 주도 개발과 함께 사용하기에 적합한 프레임워크입니다. 이번 포스트에서는 자바스크립트로 작성된 NestJS 앱을 테스트 주도 개발하는 방법에 대해 알아보겠습니다.

1. 테스트 환경 설정하기

테스트를 위해 Jest를 사용할 것이므로, 프로젝트의 devDependencies에 jest를 설치합니다.

npm install --save-dev jest

또한, Jest를 사용하기 위한 설정 파일(jest.config.js)을 프로젝트 루트 디렉토리에 생성하고 다음과 같이 설정합니다.

module.exports = {
  testEnvironment: 'node',
};

2. 첫 번째 테스트 작성하기

이제 첫 번째 테스트를 작성해보겠습니다. 예를 들어, UserController 클래스의 getUsers 메서드를 테스트하려고 합니다.

// UserController.spec.js

import { Test, TestingModule } from '@nestjs/testing';
import { UserController } from './user.controller';
import { UserService } from './user.service';

describe('UserController', () => {
  let userController: UserController;
  let userService: UserService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      controllers: [UserController],
      providers: [UserService],
    }).compile();

    userController = module.get<UserController>(UserController);
    userService = module.get<UserService>(UserService);
  });

  it('should return an array of users', async () => {
    const users = [{ id: 1, name: 'John' }, { id: 2, name: 'Alice' }];
    jest.spyOn(userService, 'getUsers').mockImplementation(() => users);

    expect(await userController.getUsers()).toBe(users);
  });
});

위 코드에서는 Jest의 describe와 it을 사용하여 테스트 스위트를 생성하고, beforeEach를 사용하여 테스트 실행 전에 필요한 모듈을 초기화합니다. 그리고 getUsers 메서드가 올바른 사용자 배열을 반환하는지 확인하는 테스트 케이스를 작성했습니다.

3. 테스트 실행하기

모든 준비가 되었으니 이제 테스트를 실행해봅시다. 다음 명령을 실행하여 Jest를 실행합니다.

npm test

Jest는 프로젝트 내에 있는 모든 .spec.js 파일을 검색하고 해당 파일에 작성된 테스트 케이스를 실행합니다. 테스트가 성공적으로 수행되었는지, 혹은 실패한 부분이 있는지 확인할 수 있습니다.

4. 추가 테스트 작성하기

다른 컨트롤러나 서비스의 메서드에 대한 테스트도 동일한 방식으로 작성할 수 있습니다. 이를 통해 각 컴포넌트의 동작을 개별적으로 검증할 수 있습니다.

프로젝트의 규모와 복잡도에 따라 테스트 커버리지를 높이기 위해 더 많은 테스트를 작성할 수도 있습니다.

마무리

이번 포스트에서는 자바스크립트로 작성된 NestJS 앱을 테스트 주도 개발하는 방법에 대해 알아보았습니다. TDD를 통해 코드의 신뢰성과 안정성을 높여 개발 생산성을 향상시킬 수 있습니다. NestJS와 Jest를 함께 사용하여 테스트 주도 개발을 적용해보세요!

#NestJS #TDD