在 React Native 测试库中使用 Mirage 模拟 API 请求

使用你的 Mirage 服务器,通过 @testing-library/react-nativeJest NativeJest Expo 在不同的服务器场景下测试你的 React Native 应用程序。

本指南假设你的应用程序已使用 React Native 测试库、Jest Native 和 Expo 设置。它也应该适用于 react-test-rendererreact-native-testing-library

步骤 1:安装 Mirage

首先,确保你已安装 Mirage

# Using npm
npm install --save-dev miragejs

# Using Yarn
yarn add --dev miragejs

步骤 2:设置你的测试环境

我们需要更新我们的 Jest 环境以与 Mirage 配合使用。

首先,安装 XMLHttpRequest 的 polyfill

# Using npm
npm install --save-dev xmlhttprequest

# Using Yarn
yarn add --dev xmlhttprequest

然后在项目的根目录创建一个新的 jest.setup.js 文件。我们将使用此文件修补 global 变量并添加对 XMLHttpRequest、self 和 window 的支持。

// jest.setup.js
global.self = global
global.window = {}
global.XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest

最后,使用 jest.config.js 让 Jest 加载我们刚刚创建的环境。

// jest.config.js
const jestPreset = require("@testing-library/react-native/jest-preset")

module.exports = {
  preset: "jest-expo",
  setupFiles: [...jestPreset.setupFiles],
  setupFilesAfterEnv: ["./jest.setup.js"],
}

这里我们告诉 Jest 在它设置测试环境后执行我们的 jest.setup.js

步骤 3:在测试中创建一个 Mirage 服务器

在测试文件中,从 Mirage 导入 Server,创建一个服务器,并模拟你的代码依赖的 API 端点

// App.test.js
import React from "react"
import { render, waitForElement } from "@testing-library/react-native"
import App from "../App"
import { createServer } from "miragejs"

let server

beforeEach(() => {
  server = createServer()
})

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 /> 组件渲染并向 /users 发出网络请求时,Mirage 将拦截并使用上面的数据进行响应。

请注意,我们已在每个测试后调用 server.shutdown(),以便 Mirage 有机会自行清理,并且不会泄漏到其他测试中。


有关更完整的示例,请查看 GitHub 上的 Mirage React Native 演示

要了解 Mirage 的强大测试功能,请阅读 应用程序测试指南