작성
·
54
0
import { Test } from '@nestjs/testing';
import { UsersService } from '../users.service';
import { IContext } from 'src/commons/interfaces/context';
import { Request, Response } from 'express';
// 주로 DB 작업할 때 가짜DB 만들 때 사용함
class MockUsersService {
mydb = [];
create({ email, password, name, age }): string {
this.mydb.push({ email, password, name, age });
const token = 'token';
return token;
}
}
describe('UsersResolver', () => {
let usersService: UsersService;
beforeEach(async () => {
const usersModule = await Test.createTestingModule({
providers: [
UsersService,
{
provide: UsersService,
useClass: MockUsersService,
},
],
}).compile();
usersService = usersModule.get<UsersService>(UsersService);
});
describe('fetchUser', () => {
it('유저 정보 찾기', () => {
const mockRequest: Request & { user?: { id: string } } = {
user: { id: '12345' },
} as Request & { user: { id: string } };
const mockResponse: Response = {} as Response;
const mockContext: IContext = {
req: mockRequest,
res: mockResponse,
};
expect(mockContext.req.user).toStrictEqual({ id: '12345' });
});
});
describe('createUser', () => {
it('유저 등록하기', async () => {
const mockToken = 'token';
const mockUser = {
email: 'aaa@aaa.com',
password: '1234',
name: '정중식',
age: 12,
};
const result = await usersService.create({ ...mockUser });
// 반환 값이 mockToken과 일치하는지 확인
expect(result).toBe(mockToken);
});
});
});
강의에서는 app.controller.spec랑 똑같이하시면됩니다~ 하고 넘어가셔서 챗지피티랑 손잡고 짜봣는데요..
어떤가요? 맞게했나요?..
개념도 생소하고 코드짜는게 넘 어렵네요..
챗지피티 이자식은 목업클래스 안만들어주고 지름길 같은
jest.fn()같은 메서드로 목업함수 만들어주고....
선생님 답변기다리겠씁니다!
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
주신 코드를 보니, NestJS
를 사용하여 백엔드 테스트 코드를 작성하신 것으로 보입니다. 대체적으로 잘 진행하셨습니다. MockUsersService
클래스를 만들어 실제 서비스를 모방하고, 이를 테스트 환경에서 UsersService
대신 사용함으로써 가짜 DB를 이용한 유저 등록과 정보 조회 로직을 테스트하고 있네요.
jest.fn()
을 사용한 목업 함수 방식은 유연성이 뛰어나고 짧은 코드로 구현할 수 있다는 장점이 있습니다. 하지만 직접 클래스를 만들어서 테스트에 필요한 메서드와 속성을 구현하는 방식도, 실제 서비스의 동작 방식을 더 잘 이해하고 모방할 수 있다는 점에서 의미가 있습니다.
두 가지 방식 다 각각의 장단점이 있으므로, 상황에 맞게 적절한 방식을 선택해서 사용하시면 됩니다. 직접 목업 클래스를 만드는 방식도 아주 유용하게 사용될 수 있으니 이 방식을 통해 많이 배우실 수 있을 것입니다.
코드에 대한 구체적인 피드백을 드리자면, 전반적으로 기본 구조는 잘 짜셨으나 실제 서비스 로직이나 DB의 동작과 더 일치하도록 목업 클래스 내부 로직을 세밀하게 조정하는 것을 추천드립니다. 예를 들어, create
메서드에서 실제로 토큰 생성 로직이 복잡하다면, 목업에서도 간단한 로직이지만 실제와 유사한 패턴의 값을 반환하도록 설정할 수 있습니다.
추가적으로, 테스트 케이스를 조금 더 다양하게 만들어서 에러 케이스나 예외 처리도 잘 되는지 확인하는 것도 중요합니다.
테스트 코드 작성은 처음에는 어려울 수 있지만, 점점 익숙해지면서 더 나은 코드 품질을 위한 중요한 도구 중 하나가 될 것입니다. 계속해서 연습하시고, 다양한 방법을 시도해보시길 권장드립니다.
화이팅입니다!