본문 바로가기
NestJs

Controller.spec.ts 에 테스트코드 작성해보기

by 콩국수는설탕 2024. 7. 15.

오늘은 실제 Board.controllerd 에 작성한 코드들에 대해 테스트코드를 작성해보았다.

먼저 사용할 서비스들을 토대로 모킹서비스 객체를 생성해주었다

그 다음 실제로 사용했던 Dto를 정의해준다

그 다음 의존성 주입을 해주고 테스트 전 임시데이터를 초기화 하는 작업을 진행해주면 된다

그다음 테스트하고자 하는 코드를 작성하면된다
이와 연관된 문법들은 jest 공식홈페이지를 참조하면서 진행하면 많이 도움이된다

  // 테스트 후 임시데이터를 초기화 하는 작업
  afterAll(async () => {
    expect(controller).toBeDefined();
    expect(service).toBeDefined();
  })

  describe('create', ()=> {
    it('should create board', async()=> {
      //Given
      const createResult = {
          ownerId: 1,
          name: "testcode",
          background_color: '#FF0000',
          id: 1,
          createdAt: "2024-07-13T08:29:27.735Z",
          updatedAT: "2024-07-13T08:29:27.735Z",
          deletedAt: null
      }
      const req = {user: {id: 1}};

      //모킹한 서비스의 create 를 실행하면 createResult 값을 리턴하게 한다는 의미
      mockBoardServcie.create.mockResolvedValue(createResult)


      //When
      //실제로 컨트롤러의 메서드를 동작시키는 부분
      //컨트롤러 메서드의 매개변수로 req, creatBoardDto 를 사용
      //req는 사용자가 보드의 owner 인지 확인하기 위한 용도
      //실제 컨트롤러와 매개변수 순, 조건이 동일해야함
      const response = await controller.create(createBoardDto,req)
      
      //Then
      const expectedResult = {data: createResult, message:MESSAGES_CONSTANT.BOARD.CREATE_BOARD.SUCCEED, statusCode:HttpStatus.CREATED }
      //실제 테스트를 진행하는 파트
      //컨트롤러 메서드가 1바퀴만 돌았는지 확인하기(로직이 두번이상 실행되면 문제있음 ㅇㅇ)
      //mock fn에대해 테스트를한다/
      expect(mockBoardServcie.create).toHaveBeenCalledTimes(1)
      //컨트롤러의 실체 create 메서드의 결과가 createResult 와 같은지 확인
      expect(response).toEqual(expectedResult);
      //tobe =  obj를 비교할때 이걸사용하면 서로다른 obj만 값이같아도 저장된 주소가 다르기때문에
      //toEqual =  obj 의 실제 속에 key,Value 를 비교함
      //컨트롤러에서 서비스의 create 메서드를 사용할때 주어진 매개변수를 사용하는지 확인
      // 실제 보드컨트롤러 30번재줄과 비교해보면 이해하기 쉽습니다.
      expect(mockBoardServcie.create).toHaveBeenCalledWith(req.user.id,createBoardDto)
      //113에서 실패한 이유는 실제로 리턴값이 다르기때문(스테이터스 코드 , 리턴메세지)
      // createResult 는 서비스가 리턴하는거고 expectedResult  는 컨트롤러의 리턴값
    });
  })