Testing Doubles in Jest: spyOn vs jest.fn Explained

KIM MINWOO
3 min readAug 15, 2024

--

오늘은 Jest 테스팅 라이브러리에서 자주 사용되는 두 가지 함수인 jest.fn()jest.spyOn()에 대해 알아보려고 합니다. 이 두 함수는 모두 테스트 더블을 생성하는 데 사용되지만, 각각의 용도와 특성에 차이가 있습니다. 함께 자세히 살펴보겠습니다

유사점

먼저, jest.fn()jest.spyOn()의 공통점을 알아봅시다:

  1. 둘 다 함수 호출을 추적할 수 있습니다.
  2. 호출 횟수, 전달된 인자 등을 확인할 수 있습니다.
  3. 모의 구현(mock implementation)을 제공할 수 있습니다.
  4. Jest의 expect 구문과 함께 사용할 수 있습니다.

이러한 공통점 때문에 두 함수는 테스트 코드에서 비슷한 용도로 사용될 수 있습니다. 하지만 세부적인 특성과 사용 목적에는 차이가 있습니다.

차이점

이제 jest.fn()jest.spyOn()의 주요 차이점을 살펴보겠습니다:

1. 생성 방식

  • jest.fn(): 새로운 모의 함수를 생성합니다.
  • jest.spyOn(): 기존 객체의 메서드를 감시합니다.

2. 사용 목적

  • jest.fn(): 주로 새로운 모의 함수를 만들 때 사용합니다.
  • jest.spyOn(): 기존 객체의 메서드를 감시하거나 대체할 때 사용합니다.

3. 원본 구현

  • jest.fn(): 기본적으로 원본 구현이 없습니다. 필요하다면 직접 구현을 제공해야 합니다.
  • jest.spyOn(): 기본적으로 원본 메서드의 구현을 유지합니다. 필요하다면 모의 구현으로 대체할 수 있습니다.

4. 적용 범위

  • jest.fn(): 독립적인 함수로 사용됩니다.
  • jest.spyOn(): 객체의 메서드에 대해 사용됩니다.

5. 복원 기능

  • jest.fn(): 복원 기능이 없습니다. 새로운 함수이기 때문입니다.
  • jest.spyOn(): .mockRestore()를 사용하여 원래 구현을 복원할 수 있습니다.

예시코드

// jest.fn() 사용
const mockFn = jest.fn();
mockFn('arg');
expect(mockFn).toHaveBeenCalledWith('arg');

// jest.spyOn() 사용
const obj = {
method: () => 'original'
};
jest.spyOn(obj, 'method');
obj.method();
expect(obj.method).toHaveBeenCalled();

// 모의 구현 제공
jest.spyOn(obj, 'method').mockImplementation(() => 'mocked');

결론

jest.fn()jest.spyOn()은 각각 고유한 특성과 용도를 가지고 있습니다. jest.fn()은 새로운 모의 함수를 만들 때 간단하고 직관적으로 사용할 수 있으며, jest.spyOn()은 기존 객체의 메서드를 감시하거나 대체할 때 더 유연하게 사용할 수 있습니다.

테스트 상황과 목적에 따라 적절한 함수를 선택하여 사용하면, 더욱 효과적이고 강력한 테스트 코드를 작성할 수 있을 것입니다.

감사합니다.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

No responses yet

Write a response