React Testing LibraryとMirageでコンポーネントのネットワークリクエストをモックする
Mirageを使って、React Testing Libraryで書かれたテスト内で直接、個々のAPIエンドポイントをモックしましょう。
このガイドは、Reactアプリケーションで既にReact Testing Libraryを使用している方を対象としています。
ステップ1: Mirageをインストールする
まず、プロジェクトにMirageを追加していることを確認してください。
# Using npm
npm install --save-dev miragejs
# Using Yarn
yarn add --dev miragejs
ステップ2: テスト内でサーバーを作成する
テストファイル内で、MirageからServer
をインポートし、サーバーを作成し、コードが必要とするAPIエンドポイントをモックします。
// src/__tests__/App.test.js
import React from "react"
import { render, waitForElement } from "@testing-library/react"
import App from "../App"
import { createServer } from "miragejs"
let server
beforeEach(() => {
server = createServer()
// If your API is at a different port or host than your app, you'll need something like:
// server = createServer({
// environment: "test",
// urlPrefix: "http://api.acme.com:3000",
// })
})
afterEach(() => {
server.shutdown()
})
it("shows the users from our server", async () => {
server.get("/users", () => [
{ id: 1, name: "Luke" },
{ id: 2, name: "Leia" },
])
const { getByTestId } = render(<App />)
await waitForElement(() => getByTestId("user-1"))
await waitForElement(() => getByTestId("user-2"))
expect(getByTestId("user-1")).toHaveTextContent("Luke")
expect(getByTestId("user-2")).toHaveTextContent("Leia")
})
<App />
コンポーネントがレンダリングされ、Reactが/users
へのネットワークリクエストを行うと、Mirageはそれをインターセプトし、上記のデータで応答します。
各テストの後でserver.shutdown()
を呼び出していることに注意してください。これにより、Mirageは自身をクリーンアップし、他のテストにリークしないようになります。
テストについて詳しくは、アプリケーションテストガイドをご覧ください。