인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

반가우면반갑다고해님의 프로필 이미지
반가우면반갑다고해

작성한 질문수

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

16-TDD

선생님 users.resolver.spec코드좀 봐주세요!

작성

·

61

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 메서드에서 실제로 토큰 생성 로직이 복잡하다면, 목업에서도 간단한 로직이지만 실제와 유사한 패턴의 값을 반환하도록 설정할 수 있습니다.

추가적으로, 테스트 케이스를 조금 더 다양하게 만들어서 에러 케이스나 예외 처리도 잘 되는지 확인하는 것도 중요합니다.

테스트 코드 작성은 처음에는 어려울 수 있지만, 점점 익숙해지면서 더 나은 코드 품질을 위한 중요한 도구 중 하나가 될 것입니다. 계속해서 연습하시고, 다양한 방법을 시도해보시길 권장드립니다.

화이팅입니다!

반가우면반갑다고해님의 프로필 이미지
반가우면반갑다고해

작성한 질문수

질문하기