[uber-eats] unit testing the user service - 1

한재창·2023년 6월 29일
0
post-thumbnail

unit testing the user service

유닛 테스트는 service에 있는 메서드를 독립적으로 테스트하기 위해 사용합니다. 자바스크립트를 쉽게 테스팅하는 npm 패키지인 jest에서 많은 함수들을 제공합니다.

npm run test:cov 모든 spec.ts 파일을 찾아서 몇 줄이 테스팅됐는지 알려주는 명령어입니다.
npm run test:watch 모든 테스트 파일들을 찾아서 무슨 일이 일어나는지 관찰하는 명령어입니다.

Setting Up Test

유닛 테스트를 시작하기 위해서는 테스트할 파일의 같은 경로에 spec.ts 파일을 만들어서 그 파일에서 테스트합니다. 테스트를 하기 위해서는 테스트 하기 전에 테스트 모듈을 만들어 그 모듈을 이용해 테스트를 진행합니다.

describe() 테스트 파일에 많은 수의 테스트 함수가 작성되어 있는 경우, 연관된 테스트 함수들끼리 그룹화하여 가독성이 좋아지게 만듭니다.
beforeAll(fn, timeout) 모든 테스트가 실행되기 전에 딱 한 번 함수를 실행합니다.

  1. users.service.spec.ts 파일을 만들고 describe() 함수를 사용해서 UserService의 메서드들을 테스트하는 함수를 묶어줍니다.

  2. beforeAll() 함수를 사용해서 테스트 실행 전에 필요한 module을 만듭니다. 이 module에는 import하고 싶은(여기서는 UserService) 것을 넣어준 뒤 컴파일합니다.

  3. 만들어진 module을 테스트할 때 사용할 수 있도록 전역변수에 저장합니다.

Mocking

테스트를 독립적으로 유지하고 실행 프로세스를 최대한 빠르게 유지하기를 원합니다. UserService에서 Injection된 Repository나 인자로 받는 JwtService 등에 관한 가짜 함수를 만들어 테스트의 독립성을 유지합니다.

getRepositoryToken() 대체 Repository로 사용할 수 있습니다.
jest.fn() 새로운 mock 함수를 생성합니다.

Record 속성 키가 Key이고 속성 값이 Type인 객체 유형을 구성합니다.

interface CatInfo {
 	age: number;
	breed: string;
}

type CatName = "miffy" | "boris" | "mordred";

const cats: Record< CatName, CatInfo > = {
	miffy: { age: 10, breed: "Persian" },
	boris: { age: 5, breed: "Maine Coon" },
	mordred: { age: 16, breed: "British Shorthair" },
};

cats.boris;

keyof 연산자 객체 type을 사용하여 해당 키의 문자열 또는 숫자 리터럴 통합을 생성합니다.

type Point = { x: number; y: number };
const hello: keyof Point; // hello에는 x, y만 할당 가능
  1. UserService에서 인자로 받는 서비스나 레퍼스토리를 사용할 수 없다는 에러가 뜹니다. 이를 고치기 위해 mock(가짜 함수)를 만들어서 사용합니다.

  2. value를 전달하기 위한 새로운 가짜 함수를 만들어줍니다.

  3. module의 providers object를 사용해서 value를 전달해줍니다. mock 레퍼스토리를 사용하기 위해서는 getRepositoryToken() 의 인자로 User를 넘겨주면 MockRepository가 UserRepository로 사용됩니다.

  4. UserRepository의 가짜 함수를 사용하기 위해 전역변수로 설정하고 BeforeAll() 함수에서 가짜 usersRepository를 가져옵니다.

profile
취준 개발자

0개의 댓글