상똥이의 Back-End 공부방

[Jest] DTO 테스트코드 작성 본문

Jest

[Jest] DTO 테스트코드 작성

상똥백 2024. 5. 9. 15:29

 

1. describe

- dto 테스트 시, 여러 개의 dto가 존재할 수 있는데 각각의 dto에 대해 다양한 테스트를 진행하는 경우 describe로 구분한다

- dto가 아래와 같은 경우

export class CreateDto { ... }
export class UpdateDto { ... }

- 테스트 코드는 아래와 같이 작성한다

describe('CreateDto', () => {	
    test('성공하는 케이스', () => {})
    test('실패하는 케이스', () => {})
    ...
});

describe('UpdateDto', () => {	
    test('성공하는 케이스', () => {})
    test('실패하는 케이스', () => {})
    ...
});

 

2. 테스트를 위한 임시 dto를 생성

- 실제 dto 형식 (경기 모집글을 작성하기 위한 dto)

export class CreateDto {
  @IsString()
  @MinLength(5, { message: ErrorCodes.INVALID_TITLE.message })
  title: string;

  @IsString()
  @MinLength(10, { message: ErrorCodes.INVALID_CONTENT.message })
  content: string;

  @IsEnum(Gender, { message: ErrorCodes.CHOOSE_GENDER.message })
  gender: Gender;

  ...
}

- 테스트를 위한 임시 dto를 테스트코드 내에 생성

describe('CreateDto', () => {
  let dto: CreateDto;
  beforeEach(() => {
    dto = plainToInstance(CreateDto, {
      title: '제목입니다.',
      content: '내용입니다.',
      gender: 'both',
      
      ...
    });
  });
}

※ beforeEach와 beforeAll

- beforeAll : describe 블록이 실행되기 전에 단 한 번만 실행됨 / 모든 테스트 케이스들이 공유할 수 있는 초기 설정을 준비할 때 사용

- beforeEach : 각 테스트 케이스들이 실행될 때마다 실행됨 / 각 테스트가 서로에게 영향을 주지 않고 독립적으로 실행될 수 있도록 함

 

3. 테스트코드

1) 성공하는 케이스

- beforEach로 임시 dto를 생성하였으므로 이 임시 dto를 바탕으로 성공하는 케이스를 작성한다.

- 유효성 검사를 실시하기 위해 validate 메서드를 사용한다.

  test('게시글 작성시 DTO 검증이 성공적으로 수행되어야 함', async () => {
    const validationErrors = await validate(dto);
    expect(validationErrors).toHaveLength(0);
  });

2) 실패하는 케이스

- 임시로 생성한 dto는 유효성 검사에 문제가 없으므로, 일부분을 바꾸어 문제가 발생하게끔 설정한다.

  test('게시글 작성이 실패해야 함 - 성별 유효성 검사 실패', async () => {
    dto.gender = 'rainbow' as Gender;
    const validationErrors = await validate(dto);
    expect(validationErrors[0].constraints).toHaveProperty('isEnum');
  });

'Jest' 카테고리의 다른 글

[Jest] 테스트코드 환경 설정, prisma mocking  (0) 2024.05.04