
목표
모듈 모킹에 대해 학습하고 정리합니다
공식문서
Mock Functions · Jest
Mock functions allow you to test the links between code by erasing the actual implementation of a function, capturing calls to the function (and the parameters passed in those calls), capturing instances of constructor functions when instantiated with new,
jestjs.io
모듈 모킹은 무엇인가?
모듈모킹의 정의
모듈모킹은 테스트 환경에서 외부 의존성을 실제로 사용하지않고, 모의 객체를 만들어 사용하는 방법입니다.
모킹을 통해 대상 코드가 특정 의존성과 상호작용하는 방식을 제어하거나 검증할 수 있습니다.
모듈모킹의 필요성
- 의존성 제거
: 네트워크, 데이터베이스, 파일 시스템과 같은 외부 리소스를 직접 호출하면 테스트 속도가 느려지거나
불안정해질 수 있습니다. 모킹을 통해 의존성을 제거하면 빠르고 안정적인 테스트가 가능합니다. - 예측 가능성
: 외부 API의 응답이나 상태는 변할 수 있으므로, 테스트를 반복 실행할 때 동일한 결과를 보장하기 어렵습니다.
모킹을 통해 예측 가능한 테스트 환경을 구축할 수 있습니다. - 에러 시뮬레이션
: 실제로 발생시키기 어려운 상황(네트워크 오류, 서버 다운 등)을 쉽게 시뮬레이션할 수 있습니다. - 비용 절감
: 실제로 클라우드 리소스나 유료 API를 호출하는 비용을 절감할 수 있습니다.
Jest에서의 모듈 모킹
1. 모듈모킹의 기본 방법
Jest의 jest.mock()을 사용하여 특정 모듈을 모킹합니다.
- mockResolvedValueOnce: Promise.resolve()로 반환될 값을 정의합니다.
- mockRejectedValueOnce: Promise.reject()로 반환될 값을 정의합니다.
import axios from 'axios';
jest.mock('axios'); // axios를 모킹
const mockedAxios = axios as jest.Mocked<typeof axios>;
test('should mock axios get request', async () => {
mockedAxios.get.mockResolvedValueOnce({ data: { success: true } }); // 모킹된 응답 정의
const result = await axios.get('/api/test');
expect(result.data.success).toBe(true);
expect(mockedAxios.get).toHaveBeenCalledWith('/api/test');
});
2. 특정 함수만 모킹
모듈 전체를 모킹하지 않고, 모듈의 일부 함수만 모킹할 수도 있습니다.
import { myFunction } from './myModule';
jest.mock('./myModule', () => ({
myFunction: jest.fn(),
}));
test('should mock specific function', () => {
const mockedFunction = myFunction as jest.Mock;
mockedFunction.mockReturnValue('mocked result');
expect(myFunction()).toBe('mocked result');
});
모킹의 장단점
장점
- 빠르고 신뢰성 높은 테스트
: 외부 의존성을 제거하여 테스트 실행 속도와 안정성을 높입니다. - 복잡한 시나리오 테스트 가능
: 실제 환경에서는 재현하기 어려운 상황(네트워크 오류, 서버 응답 지연 등)을 쉽게 테스트할 수 있습니다. - 의존성 없는 단위 테스트
: 모킹을 통해 다른 모듈에 의존하지 않고 독립적인 단위 테스트가 가능합니다.
단점
- 현실과의 괴리 가능성
: 실제 동작과 완전히 일치하지 않을 수 있으므로, 실제 환경에서의 통합 테스트도 필요합니다. - 추가 코드 작성 필요
: 모킹 설정 및 초기화 코드를 추가로 작성해야 합니다. - 오버 모킹 위험
: 지나치게 많은 모킹은 테스트가 지나치게 인위적으로 느껴질 수 있습니다.
반응형