선생님 users.resolver.spec코드좀 봐주세요!
124
작성한 질문수 142
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 메서드에서 실제로 토큰 생성 로직이 복잡하다면, 목업에서도 간단한 로직이지만 실제와 유사한 패턴의 값을 반환하도록 설정할 수 있습니다.
추가적으로, 테스트 케이스를 조금 더 다양하게 만들어서 에러 케이스나 예외 처리도 잘 되는지 확인하는 것도 중요합니다.
테스트 코드 작성은 처음에는 어려울 수 있지만, 점점 익숙해지면서 더 나은 코드 품질을 위한 중요한 도구 중 하나가 될 것입니다. 계속해서 연습하시고, 다양한 방법을 시도해보시길 권장드립니다.
화이팅입니다!
그래프 ql 문서 사용할때 느낌표 남는거 어떻게 없애나요?
0
83
2
강의 전체 소스 코드를 받고싶습니다.
0
76
2
fontawesome 사용 문의
0
77
2
소스 코드 부탁드립니다~
0
85
2
깃 레포지터리 소스
0
81
2
커리큘럼12.css 정렬 에 나오는 과제 정답알고싶어요
0
73
2
10-01 Entity TypeOrmModule.forRoot 에 entities
0
85
3
강의 버전관련 문의입니다
0
102
2
Ubuntu 설치 관련
0
61
1
schema.gql 질문 드립니다.
0
51
1
서버 재실행시 Many to Many
0
101
3
input 관련 문의
0
90
2
Rest API 보다는 graphql이 주된 내용인데
0
130
2
강의 전체 소스코드 받을수있을까요?
0
155
1
도커볼륨 마운트 관련
0
126
2
findOne 타입스크립트오류
0
109
1
http => htrtps 호출 인증서 신뢰 오류
0
349
1
self-signed certificate in certificate chain 에러 발생
0
411
1
mongoose 설치 오류
0
142
1
특정 API, 특정 IP 허용 (단일경로에 CORS 활성화)
0
281
2
08-06
0
177
3
구조랑 패턴 관련해서 질문
0
125
2
mydocker
0
128
2
coolsms statuscode 2000 인데 전송안돼는 경우 확인.
0
156
1





