mocking 이란?
( mock = 모조품, 가짜 ) 뜻 그대로 받아들이면 된다.
테스트하고자 하는 코드가 의존하는 function 이나 class에 대해 모조품을 만들어 ‘일단’ 돌아가게 하는 것이다.
왜 가짜로 대체하는가?
테스트 하고싶은 기능이 다른 기능들과 엮여있을 경우 (의존) 정확한 테스트를 하기 힘들기 때문이다.
실제 데이터베이스에 데이터를 넣는 방식으로 테스트를 할 경우, 트랜잭션이 일어나기에 IO 시간도 테스트에 포함되고, 데이터베이스 연결 상태에 따라 테스트가 실패 할 수도 있기 때문이다.
또, 테스트가 실패했을 경우 내가 작성한 컨트롤러 코드의 문제인지, 데이터베이스의 문제인지 알아차리기도 힘들기 때문에 올바른 단위테스트라고 할 수 없다.
Jest는 가짜 함수(mock function)를 생성할 수 있도록 jest.fn() 함수를 제공한다.
mock 함수는 기본적으로 아무것도 안들어있다. (아무런 동작, 리턴을 하지 않는다.
jest.fn 종류
mockReturnValue(value)
// 변수를 mock함수로 만들기
const mock = jest.fn();
// mock는 빈 함수이기 때문에 기본적으로 undefined
mock(); // undefined
mock(1); // undefined
mock([1, 2], { a: "b" }); // undefined
// mock 리턴값 지정하기
mock.mockReturnValue("I am a mock!");
mock()// I am a mock!
mock.mockReturnValue(42);
mock(); // 42
mock.mockReturnValue(63);
mock(); // 63
mockImplemetation(value)
const mock1 = jest.fn();
// 동작하는 모크 함수를 하나 만든다.
mock1.mockImplementation( (name) => `I am ${name}!` );
console.log(mock1("Dale")); // I
// 단축 속성으로 아예 jest.fn() 안에다가 바로 함수를 써서도 똑같이 구현할 수 있다.
// 이 방법이 더 간편하고 직관적이기에 자주 사용하는 편이다.
const mock2 = jest.fn( (name) => `I am ${name}!` );
console.log(mock2("Dale")); // I am Dale!