Jest에서 jest.clearAllMocks()와 jest.resetAllMocks() 차이점
Introduction
Jest는 페이스북에서 개발한 JavaScript 테스트 프레임워크로, 간편한 사용법과 빠른 실행 속도로 인기가 있다.
Jest를 이용하여 테스트 코드를 작성하던 중, 수 많은 함수나 루트를 mocking하게 되는데 지저분해진 테스트 코드를 리팩토링 하다가 mock함수의 초기화에 대한 고찰을 하게 되었다.
Jest의 모의 함수(mock functions)를 사용할 때 중요한 두 가지 함수인 jest.clearAllMocks()
와 jest.resetAllMocks()
의 차이에 대해 기술한다.
jest.clearAllMocks()
jest.clearAllMocks()
함수는 모든 모의 함수의 호출 정보를 초기화하는 데 사용한다.
이를 통해 테스트 간 독립성을 보장하며, 다양한 테스트 시나리오에서 중요한 역할을 한다.
다음은 해당 메소드를 테스트해볼 수 있는 예시 코드이다.
describe('jest.clearAllMocks test', () => {
const mockFn = jest.fn().mockImplementation(() => 'Default return value');
mockFn.mockImplementation(() => 'New return value');
mockFn('args1'); // 1st call
mockFn('args2'); // 2nd call
test('before jest.clearAllMocks', () => {
console.log(
'clearAllMocks 전, mockFn 호출 횟수 = ',
mockFn.mock.calls.length
); // 2
console.log('clearAllMocks 전, mockFn 호출 인자 = ', mockFn.mock.calls); // [ [ 'args1' ], [ 'args2' ] ]
expect(mockFn.mock.calls.length).toBe(2);
expect(mockFn()).toBe('New return value');
});
test('after jest.clearAllMocks', () => {
jest.clearAllMocks();
console.log(
'clearAllMocks 후, mockFn 호출 횟수 = ',
mockFn.mock.calls.length
); // 0
console.log('mockFn 호출 인자 = ', mockFn.mock.calls); // []
expect(mockFn.mock.calls.length).toBe(0);
expect(mockFn()).toBe('New return value');
});
})
위 코드를 풀어쓰자면 다음과 같다.
jest.clearAllMocks()
실행 이후,
- 이전에 mock함수를 2번 호출한 횟수는 초기화 되었다.
- mock함수의 인스턴스 ‘args1’, ‘args2’ 역시 초기화 되었다.
- mock함수의 반환값은, 최종 반환값으로 설정된 ‘New return value’ 그대로 남아있으며 아무런 영향이 없다.
코드의 설명과 마찬가지로,
clearAllMocks
는 mock함수의 호출 횟수, 인스턴스 등을 초기화 한다.
하지만 mock함수의 반환값은 초기화하지 않는다.
주요 사용 시나리오:
- 테스트 전/후 초기화 단계에서 호출 정보를 초기화하고 싶을 때
jest.resetAllMocks()
jest.resetAllMocks() 함수는 모든 모의 함수의 호출 정보뿐만 아니라 구현 및 반환 값 설정도 초기화하는 데 사용된다.
이를 통해 각 테스트가 완전히 독립적으로 실행되도록 보장하며, 다양한 테스트 시나리오에서 유용하게 사용할 수 있다.
describe('jest.resetAllMocks test', () => {
const mockFn2 = jest.fn().mockImplementation(() => 'Default return value');
mockFn2.mockImplementation(() => 'New return value');
mockFn2('args1'); // 1st call
mockFn2('args2'); // 2nd call
test('before jest.resetAllMocks', () => {
console.log(
'resetAllMocks 전, mockFn 호출 횟수 = ',
mockFn2.mock.calls.length
); // 2
console.log('resetAllMocks 전, mockFn 호출 인자 = ', mockFn2.mock.calls); // [ [ 'args1' ], [ 'args2' ] ]
expect(mockFn2.mock.calls.length).toBe(2);
expect(mockFn2()).toBe('New return value');
});
test('after jest.resetAllMocks', () => {
jest.resetAllMocks();
console.log(
'resetAllMocks 후, mockFn 호출 횟수 = ',
mockFn2.mock.calls.length
); // 0
console.log('mockFn 호출 인자 = ', mockFn2.mock.calls); // []
expect(mockFn2.mock.calls.length).toBe(0);
expect(mockFn2()).toBe(undefined);
});
});
위 코드를 풀어쓰자면 다음과 같다.
jest.resetAllMocks()
실행 이후,
- 이전에 mock함수를 2번 호출한 횟수는 초기화 되었다.
- mock함수의 인스턴스 ‘args1’, ‘args2’ 역시 초기화 되었다.
- mock함수의 반환값은 초기화되어
undefined
가 되었다.
resetAllMocks
는 clearAllMocks
의 모든 기능에 더해서 반환값 역시 초기화 시킨다.
즉, 완벽한 새로운 mock함수로 되돌린다.
주요 사용 시나리오:
- 테스트 전/후 초기화 단계에서 호출 정보와 구현, 반환 값 설정을 모두 초기화하고 싶을 때
- 모의 함수의 구현을 변경하는 테스트 사이에서 각 테스트의 독립성을 보장하고 싶을 때
jest.clearAllMocks()
: 모든 모의 함수의 호출 정보 초기화jest.resetAllMocks()
: 모든 모의 함수의 호출 정보뿐만 아니라 구현 및 반환 값 설정도 초기화