Mocking

jest.fn()

jest.spyOn()

우테코 테스트 코드 알아보기

MockRandoms

MockQuestions

getLogSpy

2주차 미션에서 진행 한 테스트

Mocking

함수가 함수 외부에 있는 module, function들을 사용해서 어떤 기능을 제공할 때, 그 함수는 외부 요소에 의존하게 된다. 단위 테스트에서, 테스트하고자 하는 함수(코드)가 의존하는 funciton, class에 대해 모조품을 만들고 일단 그 기능이 돌아가게 하는 것을 mocking이라고 한다.

한마디로, 어떤 코드를 테스트 할 때 그 코드가 의존하는 부분을 가짜(mocking)로 대체하는 방법을 말한다.

Mocking을 하는 이유

테스트 하려는 함수의 기능이 다른 요소, 기능들과 엮여있을 경우 오직 그 함수의 기능을 테스트하기 힘들기 때문이다.

예를 들어 회원가입 처리를 잘 하는지 테스트하기 위해서 request body에 id, password를 전달하면 정보를 추출해서 데이터베이스에 넘기는 역할을 하는 controller의 기능을 테스트 하는 상황을 가정해보자.

이 때, 실제 데이터베이스를 사용해서 테스트 하는 것은

  1. 테스트를 위한 트랜잭션이 실제 데이터베이스에 반영됨
  2. 데이터베이스에 연결이 되어야 테스트가 가능하기 때문에 연결 상태에 의존적임
  3. 테스트를 실패 했을 때, 잘못된 테스트 코드가 원인인지 데이터베이스가 원인인지 파악하기 힘듦

이러한 문제들이 있기 오직 controller의 기능만 테스트하기에는 한계가 있다.

모킹 함수를 사용하면 기존의 데이터베이스에 추출한 id, password를 전달하는 controller 메서드가 반환해야 할 값을 우리가 임의로 지정할 수 있다. 테스트 하려고 하는 것은 controller 메서드의 기능이므로 “외부 요소들을 전혀 고려 하지 않았을 때, controller 메서드는 ~~값을 반환하도록 하자”라고 가정하는 것이다.

즉, 테스트를 위한 mocking(모조품) 함수를 만드는 것이다.

jest.fn()

jest는 모킹 함수를 생성할 수 있는 함수 jest.fn()을 제공한다. 이를 통해서, 일회성 테스트 용도로 사용되는 함수의 내부 로직을 구현할 수 있다.

mockReturnValue

이 메서드는 모킹한 함수가 반환해야할 값을 임의로 지정할 수 있다.