본문 바로가기

백엔드 개발자(node.js)가 되는 과정

Nestjs 기반 테스트코드 작성법 공부중 - 1일 차 회고

728x90

Nestjs로 테스트코드를 작성하는 방법을 배워 둘 필요성을 느껴 공부를 시작했다.

가장 먼저 Nest 공식 문서를 참고했지만 솔직히 어떤 느낌으로 접근하는지 정도만 파악할 수 있었을 뿐 거~의 도움이 되지 않았다.
공식문서에서 아래 코드를 확인할 수 있다.

import { Test } from '@nestjs/testing';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

describe('CatsController', () => {
  let catsController: CatsController;
  let catsService: CatsService;

  beforeEach(async () => {
    const moduleRef = await Test.createTestingModule({
        controllers: [CatsController],
        providers: [CatsService],
      }).compile();

    catsService = moduleRef.get<CatsService>(CatsService);
    catsController = moduleRef.get<CatsController>(CatsController);
  });

  describe('findAll', () => {
    it('should return an array of cats', async () => {
      const result = ['test'];
      jest.spyOn(catsService, 'findAll').mockImplementation(() => result);

      expect(await catsController.findAll()).toBe(result);
    });
  });
});

나열된 코드를 봤을 때 과정은 아래와 같이 이해되었다.

  1. 컨트롤러를 대상으로 테스트코드를 작성함을 명시
  2. 테스팅을 위한 모듈 생성
  3. 테스티모듈에서 컨트롤러와 서비스 생성
  4. 서비스의 findAll 메서드를 수행했을 때 result 결과가 나오도록 mock 설정
  5. 컨트롤러의 findAll 메서드를 수행했을 때 그 결과가 서비스의 findAll 메서드 수행 결과와 같은지 확인한다.

위 코드에서 확인하고 싶은 바는 컨트롤러와 서비스가 잘 연결되어 있는지에 해당하는 것으로 이해했다.
또한 컨트롤러의 findAll의 리턴값이 곳 this.service.findAll인 것을 전제로 할 것이다.

여기까지만 이해했을때만 해도 순조롭다고 생각했다.
우선 배운 만큼 코드로 적용해 보았다.

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

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

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

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

  describe('findAll', () => {
    const users: User[] = [
      {
        id: 'uuid1',
        email: 'testemail1@gmail.com',
        password: 'abcd1234',
        createdAt: new Date('2023-01-01'),
        updatedAt: new Date('2023-01-01'),
        deletedAt: null,
        album: [],
      },
    ];

    it('should return an array of users metadata', async () => {
      jest.spyOn(userService, 'findAll').mockResolvedValue(users);
      const result = await userController.findAll();

      expect(result).toEqual(users);
    });
  });
});

위와 같이 코드를 작성하고서 npm start test를 실행한 결과 몇 가지 오류를 만날 수 있었다.

  1. src/...로 시작하는 절대 경로를 가진 몇몇 모듈을 jest가 읽어내지 못한다.
  2. 테스트 모듈을 생성하는 과정에서 문제가 발생한 것 같다.

jest가 경로를 찾지 못하는 부분에 대해서는 현재 "@src/"로 시작하는 경로를 로 변경하도록 하는 package.json의 설정이 있었지만 그러면 모~든 절대 경로 앞에 "@"를 붙여야 된다. 이 방법은 너무 비효율적인 방법인 것 같다. 서비스가 늘어날 때 마다 골뱅이를 신경써야 한다는게 말이 안된다고 생각한다. 분명 다른 방법이 있을 것 같아 좀 더 찾아봐야겠다.

두번째 이슈는 mock 생성 작업이 추가로 더 필요할 것으로 보여졌다. 하지만 3~4 시간을 10여 개의 블로그를 자세히 읽어보고, chatGPT에게도 물어봤지만 정말이지 그 이상으로 와닿는 해결책이 거의 없었다.

 

총 6시간을 테스트코드 작성법과 이해를 하기 위해 투자했지만 우선 Node.js express환경에서의 테스트코드 작성법부터 이해한 뒤 이전에 봤던 Nestjs 도서를 다시 한번 보는 것이 좋을 것 같다. 

728x90
728x90