MSW

Mock Service Worker

๋„คํŠธ์›Œํฌ ๊ณ„์ธต์˜ ๋ชฉ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ์›น API ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์„œ ์ž„์˜์˜ ๊ฐ’์œผ๋กœ ๋งŒ๋“  ์‘๋‹ต์œผ๋กœ ๋Œ€์ฒด

    • ์ƒ์„ฑ๋œ ์š”์ฒญ์˜ headers , query ์˜ ์„ธ๋ถ€ ๋‚ด์šฉ์„ ๊ฒ€์ฆ ๋˜ํ•œ ๊ฐ€๋Šฅ

  • ์›น API ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„ ์‘๋‹ต ์žฌํ˜„ ๊ฐ€๋Šฅ

  • ์›น API ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„๋ ค๋ฉด ์š”์ฒญ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

  • ๋ธŒ๋ผ์šฐ์ €๋‚˜ ์„œ๋ฒ„ ๋“ฑ ์–ด๋””์—์„œ ์ƒ์„ฑ๋œ ์š”์ฒญ์ธ์ง€ ๊ด€๊ณ„์—†์ด ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ์–ด BFF๋ฅผ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ํ™œ์šฉ ๊ฐ€๋Šฅ

import { setupWorker, rest } from 'msw';

const worker = setupWorker(
  rest.post("/login", async (req, res, ctx) => {
    const { username } = await req.json();
    return res(
      ctx.json({ 
       username,
       firstName: "John",
      })
    )
  })
);
worker.start();

// setupServer 
// server.ts
import { setupServer } from "msw/node";

import handlers from "./handlers";

const server = setupServer(...handlers);

export default server;

// handlers.ts
import { rest } from "msw";

import * as fixtures from "@/fixtures";

const handlers = [
  rest.get("/categories", (req, res, ctx) =>
    res(ctx.json({ categories: fixtures.categories }))
  ),
  rest.get("/products", (req, res, ctx) => {
    const categoryId = req.url.searchParams.get("categoryId");

    if (categoryId) {
      return res(
        ctx.json({
          products: fixtures.products.filter(
            (product) => product.category.id === (categoryId as string)
          ),
        })
      );
    }
    return res(ctx.json({ products: fixtures.products }));
  })]

setupWorker์™€ setupServer๋Š” ๋ฌด์—‡์ด ๋‹ค๋ฅธ๊ณ ?

  • Node.js ํ™˜๊ฒฝ์—์„œ ์„œ๋ฒ„ ์š”์ฒญ ๋ชจํ‚น: setupServer

  • ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ๋ชจํ‚น: setupWorker

jest๋Š” node.js ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๋ฏ€๋กœ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„  setupServer๋ฅผ ์‚ฌ์šฉ

Jest์šฉ ์„ธํŒ…

  • setupTests.ts ์—์„œ ํ…Œ์ŠคํŠธ์˜ ์„ค์ •์„ ๊ธ€๋กœ๋ฒŒ ๊ด€๋ฆฌ

// eslint-disable-next-line import/no-extraneous-dependencies
import "@testing-library/jest-dom";
import "whatwg-fetch";

import server from "./mocks/server";

// ํ…Œ์ŠคํŠธ ์ „ ๋ชฉํ‚นํ•œ msw ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ
beforeAll(() => server.listen({ onUnhandledRequest: "error" }));
// ๊ฐ ํ…Œ์ŠคํŠธ ํ›„ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์—ฐ๊ฒฐ๋œ ํ•ธ๋“ค๋Ÿฌ ์ดˆ๊ธฐํ™”
afterEach(() => server.resetHandlers());
// ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์™„๋ฃŒ ํ›„ ์—ฐ๊ฒฐ ๋Š๊ธฐ
afterAll(() => server.close());

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์ธ jsdom์— Fetch API๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— Fetch API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์— ํฌํ•จ๋˜๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํŒจํ•œ๋‹ค.

Fetch API์˜ ํด๋ฆฌํ•„์ธ whatwg-fetch ๋ฅผ ์„ค์น˜ํ•ด ๋ชจ๋“  ํ…Œ์ŠคํŠธ์— ์ ์šฉํ•˜๋„๋ก ์„ค์ • ํŒŒ์ผ์— import

Last updated