노트

MSW로 API 모킹

Mock Service Worker

프런트엔드#testing · 연결된 개념 8개

쉽게 말하면

MSW는 리허설 때 상대 배우 대신 대역이 대사를 받아 주듯, 네트워크로 나가는 요청을 가로채 미리 정한 응답을 돌려주는 도구예요. 앱 코드를 고치지 않고도 실제 서버 없이 테스트할 수 있어요.

비유가 깨지는 곳 대역은 정해 둔 대사만 해요. 그래서 에러 경로는 테스트 안에서 server.use로 핸들러를 덮어써 따로 검증하고, 핸들러가 없는 요청에는 경고가 떠서 빠진 모킹을 알 수 있어요.

MSW(Mock Service Worker)는 네트워크 수준에서 요청을 가로채 정해 둔 응답을 돌려주는 API(Application Programming Interface) 모킹(Mocking) 라이브러리다. 브라우저에서는 Service Worker로, Node(테스트)에서는 요청 모듈을 가로채는 방식으로 동작한다. 앱 코드의 fetch·axios를 고치지 않는다.

// handlers.js — 엔드포인트와 응답 모양만 맞추면 된다
import { http, HttpResponse, delay } from 'msw'
export const handlers = [
  http.get('/api/scoops', async () => {
    await delay()                         // 로딩 상태를 보려면 지연을 준다
    return HttpResponse.json([{ name: 'Vanilla' }])
  }),
]
 
// 테스트 설정
const server = setupServer(...handlers)   // msw/node
beforeAll(() => server.listen())
afterEach(() => server.resetHandlers())  // 테스트 중 바꾼 핸들러를 되돌림
afterAll(() => server.close())
  • 기능 테스트는 실제 서버에 의존하면 안 된다. 응답을 고정해 두면 실패 원인이 테스트 대상에만 있게 된다
  • 에러 경로는 그 테스트 안에서 server.use(http.get(url, () => new HttpResponse(null, { status: 500 })))로 덮어써서 검증한다
  • axios를 직접 모킹하는 것보다 요청 순서나 동시 요청 같은 실제 상황에 가깝다. 같은 핸들러를 개발 서버와 Storybook에서도 재사용할 수 있다(Storybook)
  • 핸들러가 없는 요청에는 경고를 내서 빠진 모킹을 알려 준다
  • 비동기로 그려지는 결과는 findBy로 기다린다(React Testing Library). 테스트 대역 일반론은 자가 테스트 코드

출처: MSW 문서

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 서버 함수와 서버 액션

    서버 함수(Server Function)는 'use server'로 표시해 서버에서만 실행되지만 클라이언트에서 네트워크 요청으로 호출할 수 있는 async 함수다. 그중 폼 제출이나 데이터 변경처럼 action 맥락(form action, transition)에서 쓰이는 것을 서버 액션(Server Action)이라 부른다. 서버 액션은 서버 함수의 부분집합이다.

  • DRF API 테스트

    DRF는 장고 테스트 위에 API 요청을 편하게 보내는 APITestCase와 APIClient를 제공한다. 장고 테스트 러너(test runner)는 테스트용 DB를 따로 만들고, 각 테스트를 트랜잭션으로 감싸 끝나면 되돌리므로 실제 데이터를 건드리지 않는다.

  • 커넥션 드레이닝과 무중단 재시작

    배포 중 서버를 재시작하는 몇 초 동안 로드밸런서가 그 서버로 요청을 보내면 502가 난다. 먼저 로드밸런서에서 빼고(드레이닝), 진행 중인 요청을 마친 뒤 재시작하고, 준비되면 다시 넣는다.

  • 브라우저 요청과 서버 간 요청

    같은 HTTP 요청이라도 브라우저에서 보내면 여러 보안 규칙이 강제되고, 서버에서 보내면 아무 제한이 없다. 브라우저 보안 정책은 신뢰할 수 없는 코드로부터 사용자를 지키려고 있기 때문이다.

  • NestJS

    NestJS는 TypeScript를 전제로 모듈·의존성 주입(Dependency Injection, DI)·데코레이터(decorator) 구조를 제공하는 Node.js 서버 프레임워크다. 2017년 Kamil Myśliwiec가 만들었고, 구조를 강제하는 방식 때문에 흔히 "Node.js의 Spring"이라 불린다.

보기 옵션