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);
});
});
});
나열된 코드를 봤을 때 과정은 아래와 같이 이해되었다.
- 컨트롤러를 대상으로 테스트코드를 작성함을 명시
- 테스팅을 위한 모듈 생성
- 테스티모듈에서 컨트롤러와 서비스 생성
- 서비스의 findAll 메서드를 수행했을 때 result 결과가 나오도록 mock 설정
- 컨트롤러의 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
를 실행한 결과 몇 가지 오류를 만날 수 있었다.
- src/...로 시작하는 절대 경로를 가진 몇몇 모듈을 jest가 읽어내지 못한다.
- 테스트 모듈을 생성하는 과정에서 문제가 발생한 것 같다.
jest가 경로를 찾지 못하는 부분에 대해서는 현재 "@src/"로 시작하는 경로를 로 변경하도록 하는 package.json의 설정이 있었지만 그러면 모~든 절대 경로 앞에 "@"를 붙여야 된다. 이 방법은 너무 비효율적인 방법인 것 같다. 서비스가 늘어날 때 마다 골뱅이를 신경써야 한다는게 말이 안된다고 생각한다. 분명 다른 방법이 있을 것 같아 좀 더 찾아봐야겠다.
두번째 이슈는 mock 생성 작업이 추가로 더 필요할 것으로 보여졌다. 하지만 3~4 시간을 10여 개의 블로그를 자세히 읽어보고, chatGPT에게도 물어봤지만 정말이지 그 이상으로 와닿는 해결책이 거의 없었다.
총 6시간을 테스트코드 작성법과 이해를 하기 위해 투자했지만 우선 Node.js express환경에서의 테스트코드 작성법부터 이해한 뒤 이전에 봤던 Nestjs 도서를 다시 한번 보는 것이 좋을 것 같다.
'백엔드 개발자(node.js)가 되는 과정' 카테고리의 다른 글
http 프로토콜로 서버 간 통신하기 - Nest.js와 Flask (0) | 2023.12.15 |
---|---|
Nestjs 기반 테스트코드 작성법 공부중 - 2일 차 회고 (0) | 2023.12.13 |
socket.io를 활용한 채팅 기능 구현에 대한 회고 (2) | 2023.12.08 |
마이크로 서비스에 대해 간략히 살펴보기 (2) | 2023.12.01 |
이벤트 기반 아키텍처(EDA) 살펴보기 (2) | 2023.11.21 |