Testing Doubles in Jest: spyOn vs jest.fn Explained

오늘은 Jest 테스팅 라이브러리에서 자주 사용되는 두 가지 함수인 jest.fn()
과 jest.spyOn()
에 대해 알아보려고 합니다. 이 두 함수는 모두 테스트 더블을 생성하는 데 사용되지만, 각각의 용도와 특성에 차이가 있습니다. 함께 자세히 살펴보겠습니다
유사점
먼저, jest.fn()
과 jest.spyOn()
의 공통점을 알아봅시다:
- 둘 다 함수 호출을 추적할 수 있습니다.
- 호출 횟수, 전달된 인자 등을 확인할 수 있습니다.
- 모의 구현(mock implementation)을 제공할 수 있습니다.
- 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()
은 기존 객체의 메서드를 감시하거나 대체할 때 더 유연하게 사용할 수 있습니다.
테스트 상황과 목적에 따라 적절한 함수를 선택하여 사용하면, 더욱 효과적이고 강력한 테스트 코드를 작성할 수 있을 것입니다.
감사합니다.