ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Jest - Testing2
    FrameWork/Jest 2023. 3. 20. 11:19

    실제 구현코드

    user.service.ts

    async updateUser(id: number, userUpdateRequestDto: UserUpdateDto) {
        const userId = await this.usersRepository.findOne({ where: { id } });
    
        if (!userId) {
          throw new BadRequestException('존재하지 않는 회원번호 입니다.');
        }
    
        const { name, nickName, memo } = userUpdateRequestDto;
    
        const user = this.usersRepository.create({ name, nickName, memo });
    
        return await this.usersRepository.update(id, user);
      }

    UserService의 updateUser 메서드를 테스트 하려고 하는데, 해당메서는 에서는 두가지를 테스트해야한다. 먼저 회원번호 id에 해당하는 유저가 있으면 수정을 진행하고 해당하는 유저가 없을 경우에는 실패하는 로직에 대해 성공적으로 수정이 이루어지고 있는지 검증이 필요하다.

     

    정보가 없는 user에 updateUser메서드를 호출했을 경우

    users.service.spec.ts

     it('생성되지 않은 유저의 id가 주어진다면 유저를 찾을수 없다는 예외를 던진다.', async () => {
        const id = 5;
    
        const userUpdateDto = {
          name: '이미나',
          nickName: '팔몬',
          memo: '순수의 문장',
        };
    
        jest.spyOn(usersRepository, 'findOne');
    
        const result = async () => {
          return await service.updateUser(id, userUpdateDto);
        };
    
        await expect(result).rejects.toThrowError(
          new NotFoundException('존재하지 않는 회원번호 입니다.'),
        );
      });

    위 단위코드 테스트에서 생성되지 않은 유저를 수정 할 때는 findOne 메서드가 undefined의 결과 값을 반환하도록 모킹한다. updatUser메서드는 모킹된 findOne에서 반환하는 값을 받아서 NotfoundException예외를 던진다. Jest에서는 rejects와 toThrowError를 사용해서 해당 코드가 NotFoundException을 던지는지 검증할 수 있다. should에서 제공되는 rejectedWith과 비슷하다.

     

    정보가 있는 user에 updateUser메서드를 호출했을 경우

    it('생성되지 않은 유저의 id가 주어진다면 유저를 찾을수 없다는 예외를 던진다.', async () => {
        const id = 5;
    
        const userUpdateDto = {
          name: '이미나',
          nickName: '팔몬',
          memo: '순수의 문장',
        };
    
        const spyOnFn = jest
          .spyOn(usersRepository, 'findOne')
          .mockResolvedValue(undefined);
    
        const result = async () => {
          return await service.updateUser(id, userUpdateDto);
        };
    
        await expect(result).rejects.toThrowError(
          new NotFoundException('존재하지 않는 회원번호 입니다.'),
        );
      });
    
      it('이미 생성된 유저의 id가 주어진다면 해당 id의 유저를 수정하고 유저를 반환한다.', async () => {
        const userId = 1;
        const userUpdateDto = {
          name: '부기묘',
          nickName: '부기',
          memo: '고양이',
        };
    
        const requestDto = new UserUpdateDto();
        Object.assign(requestDto, userUpdateDto);
    
        const creatingUser = new User();
        Object.assign(creatingUser, userUpdateDto);
    
        const existingUser = new User();
        Object.assign(existingUser, {
          id: userId,
          name: '장한솔',
          nickName: '텐타몬',
          memo: '지식의 문장',
        });
    
        const updatedUser = new User();
        Object.assign(updatedUser, {
          id: userId,
          ...creatingUser,
        });
    
        const userRepositoryFindOnSpy = jest
          .spyOn(usersRepository, 'findOne')
          .mockResolvedValue(existingUser);
        //create 메서드
        jest.spyOn(usersRepository, 'create').mockReturnValue(creatingUser);
        //update 메서드
        const userRepositorySaveSpy = jest
          .spyOn(usersRepository, 'update')
          .mockResolvedValue(updatedUser);
    
        const result = await service.updateUser(userId, requestDto);
    
        expect(userRepositoryFindOnSpy).toHaveBeenCalledWith({
          where: { id: userId },
        });
        expect(userRepositorySaveSpy).toHaveBeenCalledWith(userId, creatingUser);
        expect(result).toEqual(updatedUser);
      });
    });

    updateUser메서드에서 id에 해당하는 유저를 찾아서 유저를 수정했다는 로직의 테스트이다. findOne메서드는 미리 정해놓은 existingUser를 반환할 것이라고 mocking하고 반환된 값을이 존재할 경우에는 create메서드를 사용해서 updateUser메서드에 들어온 UserUpdateDto 타입의 값을 User type의 객체로 변환하여 반환한도록 mocking한다. 그리고 오류가 없이 정상적으로 처리된 내용을 result 변수에 담고 Jest의 expect로 검증한다. 먼저 .toHaveBeenCalledWith는 모의 함수가 특정 인수로 호출되었는지 확인하는 데 사용 할 수 있고, .toEqual로 개체의 모든 속성을 재귀적으로 비교한다.

     

    출처 - https://jhyeok.com/nestjs-unit-test/

    댓글

Designed by Tistory.