[Jest] Mock Function

mokyoungg·2021년 5월 2일
1

mock이란 무엇인가?

Mock Test는 테스트 대상 코드가 다른 시스템 모듈과 상호 작용하는 방식에 대해 주장(assertions)할 수 있는 단위테스트에 대한 접근 방식입니다.

mock test에서 의존성은 실제 객체의 동작을 시뮬레이션하는 객체로 대체된다.
mocking의 목적은 외부 종속성의 동작이나 상태가 아니라 시험 중인 코드를 분리하고 초점을 맞추는 것이다.

출처 : https://devopedia.org/mock-testing

mocking은 주로 유닛 테스트에서 사용됩니다.
테스트의 대상 객체는 다른(복잡한) 객체에 종속성이 있을 수 있습니다.
객체의 동작을 분리하기 위해 실제 객체의 동작을 시뮬레이션하는 'mocks'로 대체합니다.
이는 실제 객체가 유닛 테스트에 통합되지 않은 경우 유용합니다.

즉, 'mocking'은 실제 객체의 동작을 시뮬레이션하는 물체를 만드는 것입니다.

출처 : https://stackoverflow.com/questions/2665812/what-is-mocking

모의객체(Mock Object)란 주로 객체 지향 프로그래밍으로 개발한 프로그램을 테스트할 경우 테스트를 수행할 모듈과 연결되는 외부의 다른 서비스나 모듈들을 실제 사용하는 모듈을 사용하지 않고 실제을 모듈을 '흉내'내는 '가짜' 모듈을 작성하여 테스트의 효용성을 높이는데 사용하는 객체이다.

출처 : https://ko.wikipedia.org/wiki/%EB%AA%A8%EC%9D%98_%EA%B0%9D%EC%B2%B4

프로젝트를 하다보면 mockData를 만드는 경우가 있는데
이때 mockData를 사용하는 이유는 이후 진짜 data를 받을 때 작동하는 것을 시험해보기 위해 가짜를 만들어 미리 테스트를 해보기 위함이다.

mock의 예시 마네킹

자동차 광고를 보면 자동차의 안전성을 테스트하는 영상을 볼 수 있다.
자동차의 안정성에 대한 테스트를 진행할 때 자동차 안에 실제 사람이 운전하는 경우는 없다.
실제 사람 대신 마네킹을 넣고 테스트를 한다.
사고가 났을 때 에어백이 터지는 것을 테스트하는데 굳이 실제 사람을 넣을 필요가 없는 것이다.
사람 대신에 들어가는 마네킹을 mock이라고 볼 수 있다.

즉, mock이란 실제하는 것을 흉내내는 것이다.

mock의 사용 이유

mock을 설명하는 글에서 공통적으로 나오는 이야기는 '유닛 테스트', '외부 종속성' 이다.

유닛테스트란 무엇인가?
유닛 테스팅이란, 소프트웨어를 기능별로 쪼개고, 그리고 그 기능 내부에서 사용되는 함수들도, 쪼개고 쪼개서 아주 작은 단위로 테스팅을 하는것을 의미합니다.

출처 : https://velopert.com/3587

유닛테스트란 작은 단위로 쪼개서 테스트를 하는 방법이다.
하지만 개발을 하다보면 함수 등에서 다른 외부의 영향을 받는(외부 종속성이 있는) 경우가 많은데
이때 이러한 외부의 영향을 받지 않고 오로지 그 기능만을 테스트하기 위해 mock을 사용하는 것이다.

유닛테스트와 외부종속성의 예시 에어백

위에서 설명한 자동차 안전성에 대한 테스트가 있을 때 유닛테스트는 다양하게 나눌 수 있다.
브레이크가 잘 작동하는가, 에어백이 터지는가, 자동차 유리는 어떻게 부서지는가 등이 있다.
여기서 만약 유닛 테스트로 에어백의 작동만을 테스트한다고 가정하였을 때 외부 종속성이라고 부를 수 있는 것은 자동차의 충격의 방향(앞,뒤,옆), 자동차 충격의 강도 등이 있다.

에어백이 터지는 프로그램이 있을 때,
실제로 뒤에서 사고를 내면서 테스트를 하는 대신
뒤에서 충격이 있다고 프로그래밍하는 것을 mock이라고 부를 수 있다.

Jest에서의 mock함수

mock 함수를 사용하면 함수의 실제 구현을 지우고 함수에 대한 호출과 해당 호출에 전달된 매개 변수를 캡처하고, new로 인스턴스화 할 때 생성자 함수의 인스턴스를 캡처하고, 반환 값의 테스트 시간을 구성할 수 있어 코드 간의 연결을 테스트할 수 있습니다.

출처 : https://jestjs.io/docs/mock-functions

jest.fn()

Jest에서 mock function을 생성할 때 jest.fn() 를 사용한다.

const mockFunc = jest.fn()

jest의 mock 함수는 JS의 함수와 마찬가지로 인자를 받아서 호출할 수 있으며 다양한 메서드를 통해 값을 return 하거나 함수를 직접 작성하여 실행할 수있다.

함수 호출과 해당 호출에 대한 정보 파악

  • 작성한 mock 함수(mockFunc)에 인자를 넣었다.
  • mock 함수 호출시, 전달된 매개 변수를 캡처할 수 있는데
    이는 matchers 중 하나인 toBeCalledWith()로 테스트할 수 있다.
  • mock 함수의 호출 횟수는 toBeCalledTimes() matchers로 테스트할 수 있다.

toBeCalledWith()

  • mock 함수에 전달된 매개변수를 toBeCalledWith 라는 matcher로 확인할 수 있다.
  • 기본형, 참조형에 관계 없이 매개 변수를 캡쳐

toBeCalledTimes()

  • mock 함수가 몇번 호출이 되었는지 확인할 수 있다.
  • test 내부에서 mock 함수의 호출 횟수는 toBeCalledTimes(숫자)로 확인 가능

mockReturnValue

  • mock 함수도 일반 자바스크립트 함수처럼 값을 return 할 수 있다.
  • mock 함수의 메서드로 mockReturnValue 를 사용
  • mock 함수의 return 값을 가지고 테스트를 확인할 수 있으며
    메서드를 사용하지 않은 mock 함수의 return 값은 undefined이다.

mockImplementation

  • mock 함수를 일반 함수처럼 구현할 수 있다.
  • mock 함수의 메서드로 mockImplementation을 사용.



참고

profile
생경하다.

0개의 댓글