250x250
반응형
arkhyeon
arkhyeon
arkhyeon
전체 방문자
오늘
어제
  • 분류 전체보기 (88)
    • Spring (5)
    • Java (4)
    • React (25)
      • TypeScript (6)
      • JavaScript (1)
      • Jest (9)
    • NEXT (8)
    • SQL (1)
    • React native (1)
    • CSS (3)
    • Web (1)
    • Git (3)
    • ETC (6)
    • 빅데이터DB (8)
    • Docker (4)
    • Tool (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • react19
  • react
  • react websocket
  • react usetransition
  • websocket
  • react jest
  • HIVE
  • javasciprt websocket
  • kudu
  • docker tomcat
  • react spring websocket
  • javascript wss
  • WSS
  • websocket server
  • Spring WebSocket
  • react typescript
  • react loading
  • jest
  • usetransition
  • node WebSocket

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
arkhyeon

arkhyeon

React/Jest

JEST Mock Service Worker 설정 및 기본 사용

2023. 6. 15. 15:16
728x90
반응형

Mock Service Worker

Service Worker API를 사용하여 실제 요청을 가로채는 API Mocking 라이브러리입니다.

서버에 대한 호출을 막고 사용자가 작성한 응답을 전송

  1. 응답을 보내줄 핸들러 작성
  2. 핸들러를 이용해 응답을 보낼 서버 작성
  3. 테스트 전 서버가 요청을 MSW로 라우팅, 핸들러 재설정, 서버 종료에 대한 테스트 서버 설정
npm i -D msw

Jest를 이용해 axios를 모킹하면 안 되나요?

간단한 앱에서는 모킹이 가능하지만 더 복잡한 앱에서는 MSW로 다양한 도구를 이용할 수 있다

axios 모킹에 MSW를 사용하는 이유는 여러 가지입니다.

  1. 동시 요청에 대한 Mocking 반환값은 관리하기 어렵고 불안정하다.
  2. 페이지를 재정렬 시 모의 화면에서 반환값의 순서가 잘못되어 테스트가 실패할 수도 있다.
  3. 요청의 POST 데이터 등에 따라 값을 반환하고 싶을 때 MSW는 핸들러 함수로 가능하다.
  4. MSW는 쿠키, 이진 응답(예: 이미지) 등 요청의 정교하게 처리할 수 있다.
  5. 서버 요청 시 사용할 메소드를 바꿀 수 있고, MSW는 어떤 메소드를 사용하든 작동한다.

Mocking REST API

  1. rest 작성 후 HTTP 메소드 선택(GET, POST, PATCH…)
  2. reponse resolver 작성
    • req : 요청에 대한 정보 처리 작성
    • res : 응답에 대한 처리 작성
    • ctx : 응답에 대해 어떻게 처리할건지 자세히 작성
//src/mocks/handlers.js
import { rest } from "msw";

export const handlers = [
  rest.get("<http://localhost:3030/scoops>", (req, res, ctx) => {
    return res(
      ctx.json([
        { name: "Chocolate", imagePath: "./images/chocolate.png" },
        { name: "Vanilla", imagePath: "./images/vanilla.png" },
      ])
    );
  }),
];

서버설정

위의 handlers에서 정의한 요청 핸들러로 서버 인스턴스를 정의한다.

//src/mocks/server.js
import { handlers } from "./handlers";
import { setupServer } from "msw/node";

export const server = setupServer(...handlers);

테스트 서버 설정

setupTests.js 파일은 CRA으로 프로젝트 생성했다면 src 폴더에 파일이 있지만 다른 방법으로 프로젝트를 생성했다면 본인이 직접 만들어야 하며 서로 파일의 위치가 다르다.

beforeAll(() => server.listen());

테스트 전 서버가 항상 수신 대기하며 모든 네트워크 요청을 실제 네트워크가 아닌 MSW로 라우팅

afterEach(() => server.resetHandlers());

각 테스트가 끝나면 핸들러를 서버 정의했을 때의 핸들러로 재설정

afterAll(() => server.close());

모든 테스트가 끝나면 서버를 종료

CRA - setupTests.js

//src/setupTests.js -- CRA
import "@testing-library/jest-dom";

// src/setupTests.js 정의된 파일에서 서버를 가져오기
import { server } from "./mocks/server.js";

beforeAll(() => server.listen());

afterEach(() => server.resetHandlers());

afterAll(() => server.close());

Vite - jest.setup.js

//[최상위 루트]/jest.setup.js -- Vite
import "@testing-library/jest-dom";

// src/setupTests.js 정의된 파일에서 서버를 가져오기
import { server } from "./mocks/server.js";

beforeAll(() => server.listen());

afterEach(() => server.resetHandlers());

afterAll(() => server.close());
728x90
반응형

'React > Jest' 카테고리의 다른 글

Jest 원하는 테스트만 실행  (0) 2023.06.15
JEST Mock Service Worker 테스트 내부 사용  (0) 2023.06.15
React Jest user-event FireEvent  (0) 2023.06.07
Testing React with Jest and React Testing Library - 2  (0) 2023.05.31
Testing React with Jest and React Testing Library - 1  (0) 2023.05.25
    'React/Jest' 카테고리의 다른 글
    • Jest 원하는 테스트만 실행
    • JEST Mock Service Worker 테스트 내부 사용
    • React Jest user-event FireEvent
    • Testing React with Jest and React Testing Library - 2
    arkhyeon
    arkhyeon

    티스토리툴바