React Testing LibraryとMirageでアプリのネットワークリクエストをモックする
開発とテストの間でMirageサーバーを共有するために集中化する準備ができたら、React Testing Libraryで記述したテストで共有サーバーを使用するには、次の手順に従います。
このガイドは、ReactアプリでReact Testing Libraryを既に使用している人を対象としています。
ステップ1:Mirageをインストールする
まず、プロジェクトにMirageを追加したことを確認してください
# Using npm
npm install --save-dev miragejs
# Using Yarn
yarn add --dev miragejs
ステップ2:サーバーを定義する
共有サーバーを定義する一般的な場所は、src/server.js
です。
// src/server.js
import { createServer, Model } from "miragejs"
export function makeServer({ environment = "test" } = {}) {
let server = createServer({
environment,
models: {
user: Model,
},
seeds(server) {
server.create("user", { name: "Bob" })
server.create("user", { name: "Alice" })
},
routes() {
this.namespace = "api"
this.get("/users", (schema) => {
return schema.users.all()
})
},
})
return server
}
Create React Appでビルドされたアプリでは、このファイルが
src/
ディレクトリの下にあることを確認してください。これにより、ファイルへの変更が再ビルドをトリガーします。
ステップ3:テストで共有サーバーを使用する
makeServer
関数をインポートし、beforeEach
関数とafterEach
関数を使用してサーバーを起動およびシャットダウンします。次に、テストを使用してMirageにデータをシードするか、Mirageを必要な状態にするためのその他の変更を加えます
// src/__tests__/App.test.js
import React from "react"
import { render, waitForElement } from "@testing-library/react"
import App from "../App"
import { makeServer } from "../server"
let server
beforeEach(() => {
server = makeServer()
})
afterEach(() => {
server.shutdown()
})
it("shows the users from our server", async () => {
server.create("user", { name: "Luke" })
server.create("user", { 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")
})
各テストは独自の分離されたMirageサーバーインスタンスを取得し、行った状態またはサーバーの変更はテスト間でリークしません。
サーバーがtest
環境でインスタンス化されていることを確認してください。(上記のmakeServer
関数の例では、environment
をデフォルトでtest
にしています。)
これで、Mirageサーバーの独自の分離されたインスタンスを持つテストを引き続き記述できるようになり、テストごとに必要なとおりに変更できます。
テストの詳細については、アプリケーションテストガイドを参照してください。