Jest service 테스팅하기

이주희·2023년 12월 18일
0

NestJS

목록 보기
1/2
import { Test, TestingModule } from '@nestjs/testing';
import { BoardsService } from './boards.service';
import { BoardRepository } from './board.repository';
import { Board } from './board.entity';

class BoardRepositoryMock {
  find() {}
  // createQueryBuilder() {
  //   return {
  //     where: jest.fn().mockReturnThis(),
  //     getMany: jest.fn().mockReturnThis(),
  //     getOne: jest.fn().mockReturnThis(),
  //   };
  // }
  // create() {}
  // save() {}
  // findOne() {}
  // delete() {}
}

describe('BoardsService', () => {
  let service: BoardsService;
  let boardRepository: BoardRepository;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        BoardsService,
        { provide: BoardRepository, useClass: BoardRepositoryMock },
      ],
    }).compile();

    service = await module.get<BoardsService>(BoardsService);
    boardRepository = module.get<BoardRepository>(BoardRepository);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });

  describe('getAllBoards()', () => {
    it('배열 반환해줘', async () => {
      const boards: Board[] = [];
      jest.spyOn(boardRepository, 'find').mockResolvedValue(boards);
      expect(await service.getAllBoards()).toBeInstanceOf(Array);
    });
  });

});

class BoardRepositoryMock {
  find() {}
  // createQueryBuilder() {
  //   return {
  //     where: jest.fn().mockReturnThis(),
  //     getMany: jest.fn().mockReturnThis(),
  //     getOne: jest.fn().mockReturnThis(),
  //   };
  // }
  // create() {}
  // save() {}
  // findOne() {}
  // delete() {}
}

Repository를 Mock로 대체하도록 만들어준다

테스트 실행 전에 초기화 설정

beforeEach(async () => {
  const module: TestingModule = await Test.createTestingModule({
    providers: [
      BoardsService,
      { provide: BoardRepository, useClass: BoardRepositoryMock },
    ],
  }).compile();

  service = module.get<BoardsService>(BoardsService);
  boardRepository = module.get<BoardRepository>(BoardRepository);
});
  • TestingModule, compile : 테스트 모듈 생성 및 컴파일
  • providers : 테스트 모듈 안에서 사용할 서비스 및 의존성 정의
    BoardRepository는 위에서 정의한 Mock 함수로 대체
  • module.get<>();
    컴파일된 모듈에서 service와 Repository를 가져옴
    Jest에서 제공하는 mock된 버전이 사용된다..!

테스트 코드

describe('getAllBoards()', () => {
  it('should return an array', async () => {
    const boards: Board[] = []; // Mock your expected boards
    jest.spyOn(boardRepository, 'find').mockResolvedValue(boards);

    // 특정 메서드 호출 시 반환되는 값이 배열의 인스턴스인지 확인
    expect(await service.getAllBoards()).toBeInstanceOf(Array);
  });
});
  • describe로 그룹화, 여러가지 it 블록 포함 (개별 테스트케이스)
  • jest.spyOn()
    boardRepository의 find 함수 찾기
    getAllBoards에서 내부적으로 boardRepository.find 호출할 때 실제 데이터베이스 대신
    board를 반환하게 된다!

0개의 댓글