Vitest의 함수 모킹과 스파잉

mocking은 단위 테스트를 작성할 때, 해당 코드가 의존하는 부분을 가짜(mock)로 대체하는 기법을 말하는데요. 일반적으로 테스트하려는 코드가 의존하는 부분을 직접 생성하기가 너무 부담스러운 경우 mocking이 많이 사용됩니다.


예를 들어, 데이터베이스에서 데이터를 삭제하는 코드에 대한 단위 테스트를 작성할 때, 실제 데이터베이스를 사용한다면 여러 가지 문제점이 발생할 수 있습니다.


  • 데이테베이스 접속과 같이 Network이나 I/O 작업이 포함된 테스트는 실행 속도가 현저히 떨어질 수 밖에 없습니다.

  • 프로젝트의 규모가 켜져서 한 번에 실행해야 할 테스트 케이스가 많이지면 이러한 작은 속도 저하들이 모여 큰 이슈가 될 수 있으며, CI/CD 파이프라인의 일부로 테스트가 자동화되어 자주 실행되야 한다면 더 큰 문제가 될 수 있습니다.

  • 테스트 자체를 위한 코드보다 데이터베이스와 연결을 맺고 트랜잭션을 생성하고 쿼리를 전송하는 코드가 더 길어질 수 있습니다. 즉, 배보다 배꼽이 더 커질 수 있습니다.

  • 만약 테스트 실행 순간 일시적으로 데이터베이스가 오프라인 작업 중이었다면 해당 테스트는 실패하게 됩니다. 따라서 테스트가 인프라 환경에 영향을 받게됩니다. (non-deterministic)

  • 테스트가 종료 직 후, 데이터베이스에서 변경 데이터를 직접 원복하거나 트렌잭션을 rollback 해줘야 하는데 상당히 번거로운 작업이 될 수 있습니다.


무엇보다 이런 방식으로 테스트를 작성하게 되면 특정 기능만 분리해서 테스트하겠다는 단위 테스트(Unit Test)의 본연의 의도에 맞지 않게 되겠죠? mocking은 이러한 상황에서 실제 객체인 척하는 가짜 객체를 생성하는 매커니즘을 제공합니다. 또한, 테스트가 실행되는 동안 가짜 객체에 어떤 일들이 발생했는지를 기억하기 때문에 가짜 객체가 내부적으로 어떻게 사용되는지 검증할 수 있죠. 결론적으로, mocking을 이용하면 실제 객체를 사용하는 것보다 훨씬 가볍고 빠르게 실행되면서도, 항상 동일한 결과를 내는 테스트를 작성할 수 있습니다.


이번 포스팅에서는 Vitest에서 mocking과 spying 기능을 어떻게 쓸 수 있는지 배우겠습니다.


📝 포스팅: https://www.daleseo.com/vitest-fn-spy-on/

🧑‍💻 실습 코드: https://stackblitz.com/edit/vitest-fn-spy-on?file=src%2FuserService.test.ts


차세대 테스팅 프레임워크로 각광받고 있는 Vitest를 공부하고 계신다면 아래 게시물도 같이 참고해보시면 도움이 될 것 같습니다.


📕 Vitest 처음 시작하기: https://careerly.co.kr/comments/99556

📗 Vitest의 자주 쓰이는 매처 함수 총정리: https://careerly.co.kr/comments/102708

📘 Vitest로 테스트 전/후 처리하기: https://careerly.co.kr/comments/103118

📙 Vitest로 테스트 그룹화 및 실행 제어하기: https://careerly.co.kr/comments/105217

Vitest의 함수 모킹과 스파잉

www.daleseo.com

Vitest의 함수 모킹과 스파잉

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2024년 6월 13일 오후 11:15

 • 

저장 16조회 2,677

댓글 0

    함께 읽은 게시물

    진짜 노동의 생산성이 높아질수록 가짜 노동이 늘어나는 이유

    “왜 우리는 일은 잘했는데 더 바빠졌을까?”

    ... 더 보기

    조회 214


    혹시 Cursor 채팅만 사용하시나요? Agent 쓰는 방법!

    Cursor와 함께라면, 더이상 에디터는 단순한 입력 도구가 아닌

    ... 더 보기

    📰 OpenAI가 ChatGPT의 커넥터 기능을 업데이트하면서 MCP 지원을 추가했네요.

    ... 더 보기


    웹 앱이 만들어지던 시기에도, 모바일 앱이 창궐(?)하는 시기에도 웹의 종말론 그런게 항상 나왔었다. 앱은 서로를 연결하지 않으니까.


    하지만 웹은 그 존재 의의를 계속 진화시키고 발전시켜가며 중요한 역할을 계속 해 왔다.


    ... 더 보기

    Next.js 까보기: "쓸 줄 아는 개발자"에서 "알고 쓰는 개발자로" 강의를

    ... 더 보기

    Next.js 까보기: "쓸 줄 아는 개발자"에서 "알고 쓰는 개발자"로

    www.productengineer.info

    Next.js 까보기: "쓸 줄 아는 개발자"에서 "알고 쓰는 개발자"로