유닛 테스트는 service에 있는 메서드를 독립적으로 테스트하기 위해 사용합니다. 자바스크립트를 쉽게 테스팅하는 npm 패키지인 jest에서 많은 함수들을 제공합니다.
npm run test:cov
모든 spec.ts 파일을 찾아서 몇 줄이 테스팅됐는지 알려주는 명령어입니다.
npm run test:watch
모든 테스트 파일들을 찾아서 무슨 일이 일어나는지 관찰하는 명령어입니다.
유닛 테스트를 시작하기 위해서는 테스트할 파일의 같은 경로에 spec.ts 파일을 만들어서 그 파일에서 테스트합니다. 테스트를 하기 위해서는 테스트 하기 전에 테스트 모듈을 만들어 그 모듈을 이용해 테스트를 진행합니다.
describe()
테스트 파일에 많은 수의 테스트 함수가 작성되어 있는 경우, 연관된 테스트 함수들끼리 그룹화하여 가독성이 좋아지게 만듭니다.
beforeAll(fn, timeout)
모든 테스트가 실행되기 전에 딱 한 번 함수를 실행합니다.
users.service.spec.ts
파일을 만들고 describe() 함수를 사용해서 UserService의 메서드들을 테스트하는 함수를 묶어줍니다.
beforeAll() 함수를 사용해서 테스트 실행 전에 필요한 module을 만듭니다. 이 module에는 import하고 싶은(여기서는 UserService) 것을 넣어준 뒤 컴파일합니다.
만들어진 module을 테스트할 때 사용할 수 있도록 전역변수에 저장합니다.
테스트를 독립적으로 유지하고 실행 프로세스를 최대한 빠르게 유지하기를 원합니다. 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만 할당 가능
UserService에서 인자로 받는 서비스나 레퍼스토리를 사용할 수 없다는 에러가 뜹니다. 이를 고치기 위해 mock(가짜 함수)를 만들어서 사용합니다.
value를 전달하기 위한 새로운 가짜 함수를 만들어줍니다.
module의 providers object를 사용해서 value를 전달해줍니다. mock 레퍼스토리를 사용하기 위해서는 getRepositoryToken() 의 인자로 User를 넘겨주면 MockRepository가 UserRepository로 사용됩니다.
UserRepository의 가짜 함수를 사용하기 위해 전역변수로 설정하고 BeforeAll() 함수에서 가짜 usersRepository를 가져옵니다.