jest.fn() 이란?
테스트 코드 수행 시 mock 함수를 생성하는 함수이다. mock의 사전적 의미는 "거짓으로", "모조의" 라는 뜻으로 해당 테스트 코드가 의존하는 부분을 가짜 함수로 대체하는 함수이다. 의존적인 부분의 상태에 따라 테스트하고자 하는 부분의 테스트 결과가 영향을 받을 수 있기에 jest.fn()을 사용하여 의존하는 부분을 대체하는 것이다.
예를 들어 Database에 데이터를 저장하는 테스트를 진행한다고 가정해보자.
실제로 DB를 사용하여 테스트하는 경우 Network, I/O 같은 작업으로 인해 실행 속도가 저하될 수 있고 프로젝트 규모가 커지면 이러한 속도 저하의 원인은 큰 이슈를 초래할 수있다. 그 뿐만 아니라 데이터를 전송하는 과정중 Network 상태로 인해 정상적으로 전송이 되지 않거나 Database가 죽어있는 경우 테스트 결과에 영향을 줄 수 있다. 테스트 종료가 된 이후에도 데이터를 원복하거나 트랜잭션을 롤백 작업 등 데이터 저장 테스트 하나에 배보다 배꼽이 더 커지는 결과를 초래할 수 있다.
jest.fn()을 이용해서 가짜 함수를 생성하면 이러한 외부의 의존적인 부분으로 인해 받는 문제들을 해결할 수 있고 jest.fn()으로 생성된 가짜함수가 어떻게 호출되는지 모두 기억하고 있기 때문에 내부적으로 어떻게 사용되는지 검증할 수 있다.
jest.fn() 사용법
mock 함수 생성
가짜 함수(mock function)을 생성하기 위해 jest.fn() 사용
const mockFunction = jest.fn();
jest.fn()으로 생성된 가짜 함수는 자바스크립트 함수와 동일한 방식으로 인자를 전달하여 호출할 수 있다.
mockFucntion();
mockFunction('hello');
결과값 반환 설정
생성된 가짜함수가 어떤 결과값(return)을 반환할지 지정해주지 않았기 때문에 호출 결과는 모두 undefined 이다. mockReturnValue를 사용하여 어떤 값을 리턴해야할지 설정할 수 있다.
mockFunction.mockReturnValue("hello world!");
console.log(mockFunction()); // hello world!
검증
가짜 함수의 정말 유용한 점은 몇번 호출 되었고 어떤 인자가 넘어왔는지 검증이 가능하다는 것이다.
const mockFunction = jest.fn();
mockFunction.mockReturnValue("hello world!");
it("mockFunction Test", () => {
mockFunction('hello');
mockFunction();
expect(mockfunction).toBeCalledWith('hello') // true
expect(mockfunction).toBeCalledTimes(2) // true
expect(mockfunction()).toBe("hello world!") // true
expect(mockfunction()).toEqual("hello world!") // true
expect(mockfunction()).toStrictEqual("hello world!") // true
})