동작원리
yarn create vite msw_study --template-react-ts
cd msw_study
yarn
yarn add msw --dev
yarn run dev
POST/login : 유저가 로그인 가능하도록 하는 것
GET/user : 로그인된 유저의 정보를 리턴하는 것
// src/mocks/handlers.js
import { rest } from 'msw'
export const handlers = [
// Handles a POST /login request
rest.post('/login', /*response resolver*/),
// Handles a GET /user request
rest.get('/user', /*response resolver*/),
]
위에서 request handler를 작성하였는데, rest.post('/login', **여기**)**,
이 코드에 여기** 부분에는 req
, res
, ctx
를 인자로 갖는 response resolver
콜백함수가 들어가야 한다.
req
: 서버로 요청이 전송되다 붙잡힌 requestres
: 모킹된 responsectx
: 모킹된 response의 status code, headers, body 등import {rest} from 'msw';
export const handlers = [
rest.post('/login', (req, res, ctx) => {
sessionStorage.setItem('is-authenticated', 'true);
return res(
ctx.status(200)
)
}
rest.get('/user', (req, res, ctx) => {
const isAuth = sessionStorage.getItem('is-authenticated');
if(!isAuth){
return res(
ctx.status(403),
ctx.json({
errorMessage : "Not Authorized",
})
)
}
return res(
ctx.status(200),
ctx.json({
usename: 'admin',
})
)
})
]
‘/login’
이라는 요청 경로를 넣었고, 두 번째 파라미터로는 response resolver라는 콜백함수를 넣어주었다.response resolver
함수는 res, req, ctx를 인자로 갖는다.req
, res
, ctx
를 사용하여 원하는 조건에 따라 모의 응답을 작성한다.‘is-authenticated’
라는 키에 true
값을 넣어준다.'is-authenticated'
키의 값을 가져온다.false
라면 상태코드 403번 (Forbidden, 서버가 요청을 이해했지만 승인 거부함)과 에러메시지를 전송하고true
라면 상태코드 200번과 username
을 함께 리턴해준다yarn add msw --dev
브라우저에서 사용하기 위해선 MSW를 서비스 워커에 등록하는 과정이 필요하다. 아래 명령어를 입력하면 서비스 워커 등록을 위한 파일이 public 폴더에 추가된다
npx msw init <PUBLIC_DIR> --save
npx msw init public/ --save
import { setupWorker } from "msw";
import { handlers } from "./handlers";
export const worker = setupWorker(...handlers);
// src/index.js
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
// 아래 if문이 worker을 실행하는 코드
if (process.env.NODE_ENV === 'development') {
// 공식문서에선 아래 코드를 이용하라 하였다.
const { worker } = require('./mocks/browser')
// 그러나 Vite를 이용하여 개발하는 경우 require를 사용하지 않으므로 await import를 해주면 된다.
const { worker } = await import("./mocks/browser");
worker.start()
}
ReactDOM.render(<App />, document.getElementById('root'))
[MSW] Mocking enabled
라는 문구가 콘솔창에 뜨면 mocking이 활성화 된 것이다 !
개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.