Jest 사용법 - Mocking Modules

공식문서에 있는 예제를 통해 기본적인 사용법을 빠르게 익힌다. 따라서 모든 내용은 공식 문서 기반이며, 추후에 테스트를 많이 작성하면서 발생한 엣지 케이스를 이 내용에 덧붙여 추가할 예정이다.

이전글에 연장선에 있는 글이다. 공식 문서에서는 하나의 페이지에서 다루나, 내가 잘 헷갈리고 순간 고민하는 내용이라 분리해서 작성한다.

공식 문서에 있는 예제를 온전히 사용하지 않고, jsonplaceholder에서 실제 API를 이용하여 axios 라이브러리를 모킹하여 테스트를 진행해 본다.

예제코드

import axios from "axios";

class Posts {
  static one(postNumber) {
    return axios
      .get(`https://jsonplaceholder.typicode.com/posts/${postNumber}`)
      .then((d) => d.data);
  }
}

export default Posts;

앞에 내용은 상관없으나, 이건 codesandbox로 테스트 하지 말것.("jest.mock is not a function")

아.. 내 저녁 시간... https://github.com/codesandbox/codesandbox-client/issues/513

모의 모듈(Mocking Modules)

실제로 API를 호출하지 않고(= 느리고 취약한 테스트를 생성하지 않고) 테스트하기 위해, jest.mock(모듈이름) 함수를 사용하여 axios 모듈을 자동으로 모킹할 수 있다.

import Posts from "./post";
import axios from "axios";

jest.mock("axios");

test("post를 fetch 할 수 있다", () => {
  const firstPost = {
    body:
      "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto",
    id: 1,
    title:
      "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
    userId: 1
  };
  const response = { data: firstPost };
  axios.get.mockResolvedValue(response);
  
  // 또는 아래와 같이 작성해도 된다.
  // axios.get.mockImplementation(() => Promise.resolve(response));

  return Posts.one(1).then((d) => expect(d).toEqual(firstPost));
});

mockResolvedValue는 아래와 같은 구문의 문법 설탕(Syntactic sugar)이다.

jest.fn().mockImplementation(() => Promise.resolve(value));

Last updated