본문 바로가기

Sparta/TIL

24.02.27 TIL Mocking

mock의 정의

테스트를 하는 클래스 이외의 내용을 일부러 변경하는 것도 번거롭고 변경하는 곳의 클래스가 복잡하고 방대한 처리를 하다보면 변경, 저장의 수만큼 수고가 생긴다. 그런 곤란한 문제가 생겼을 때 사용하는 것이 mock이다.

 

한마디로, 단위 테스트를 작성할 때, 해당 코드가 의존하는 부분을 가짜(mock)로 대체하는 기법을 말한다.

테스트 하고싶은 기능이 다른 기능들과 엮여있을 경우(의존) 정확한 테스트를 하기 힘들기 때문이다.

 

Mocking은 테스트를 독립시키기 위해 의존성을 개발자가 컨트롤하고 검사할 수 있는 오브젝트로 변환하는 테크닉입니다. 의존성은 무엇이든 될 수 있지만, 일반적으로 import 하는 모듈입니다.

 

우리가 Jest에서 Mocking을 이야기할 때, 일반적으로 의존성을 Mock Function으로 대체하는 것에 대해 말합니다. 기존의 데이터베이스 저장 메소드를 mock 함수로 만든다. mock함수를 호출했을 때 반환받기 원하는 값을 우리가 직접 지정해준다. 

 

 

mock의 여러 메소드

Jest는 mock 함수를 생성할 수 있도록 jest.fn() 메소드를 제공한다. mock 함수의 인스턴스를 만드는 것인데, 이를 이용해서 내부의 함수를 진짜같이 구동해서 코드를 테스트 할 수 있게 된다. 특히, 테스트 코드의 객체가 실제로 자신이 쓰는 언어의 객체일 필요는 없다는 것이 큰 특징이다.

 

1)mockReturnValue(value) : 함수가 호출될 때 반환되는 값을 정할 수 있다.

2)mockResolveValue(value) : 비동기 함수에서 resolve 값을 받는다.

 

res.status는 메서드 체이닝이 가능해야 하므로 자기자신 res를 반환하도록 한다.

 

jest.mock() : 그룹을 한꺼번에 모킹처리 해줄 때 사용. 보통 객체 안에 요소들이 엄청 많은 경우 이를 모듈화하며 분리해서 관리한다. 이를 이용해 모듈 자체를 그룹으로 모킹화하는 기법이다.

 

jest.spyOn() : 해당 함수의 호출 여부와 어떻게 호출되었는지만 알아내야 할 때 어떤 인자가 넘어갔는지 정보를 캘 수 있다.