Contents

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() 실행 이후,

  1. 이전에 mock함수를 2번 호출한 횟수는 초기화 되었다.
  2. mock함수의 인스턴스 ‘args1’, ‘args2’ 역시 초기화 되었다.
  3. 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() 실행 이후,

  1. 이전에 mock함수를 2번 호출한 횟수는 초기화 되었다.
  2. mock함수의 인스턴스 ‘args1’, ‘args2’ 역시 초기화 되었다.
  3. mock함수의 반환값은 초기화되어 undefined가 되었다.

 

resetAllMocksclearAllMocks의 모든 기능에 더해서 반환값 역시 초기화 시킨다.
즉, 완벽한 새로운 mock함수로 되돌린다.
 

주요 사용 시나리오:

  • 테스트 전/후 초기화 단계에서 호출 정보와 구현, 반환 값 설정을 모두 초기화하고 싶을 때
  • 모의 함수의 구현을 변경하는 테스트 사이에서 각 테스트의 독립성을 보장하고 싶을 때

 

Differences between jest.clearAllMocks() and jest.resetAllMocks()
  • jest.clearAllMocks() : 모든 모의 함수의 호출 정보 초기화
  • jest.resetAllMocks(): 모든 모의 함수의 호출 정보뿐만 아니라 구현 및 반환 값 설정도 초기화