集成和单元测试
虽然 Mirage 最初是为验收测试而设计的,但它在编写集成和单元测试时也能很好地工作。
重用全局服务器
假设您有一个数据获取组件,您想编写一个测试来验证它的行为。
您可以使用上一指南中介绍的 startMirage
约定,并像在应用测试中一样,针对您的全局服务器定义测试您的组件
// UserTable.test.js
import UserTable from "./UserTable"
import { startMirage } from "./mirage"
let server
beforeEach(() => {
server = startMirage()
})
afterEach(() => {
server.shutdown()
})
it("fetches the list of countries", async () => {
server.createList("user", 5)
const { getByTestId } = render(<UserTable />)
await waitForElement(() => getByTestId("users"))
expect(getByTestId("user-row")).toHaveLength(5)
})
创建一次性服务器
您也可以为仅用于测试组件目的创建新的独立 Mirage 服务器。这对于组件库或可重用的数据获取组件,甚至用于测试数据获取钩子非常有效
// useQuery.test.js
import { createServer, Model } from "miragejs"
import React from "react"
import { useQuery } from "./useQuery"
function Movies() {
const { data } = useQuery("get", "/api/movies")
return (
<>
<h1>Movies</h1>
{data.movies.map((movie) => (
<p key={movie.id} data-testid="movie">
{movie.title}
</p>
))}
</>
)
}
let server
beforeEach(() => {
server = createServer({
environment: "test",
models: {
movie: Model,
},
routes() {
this.namespace = "api"
this.resource("movie")
},
})
})
afterEach(() => {
server.shutdown()
})
it("can fetch data", async () => {
server.createList("movie", 5)
const { getByTestId } = render(<Movies />)
await findByText("Movies")
expect(getAllByTestId("movie")).toHaveLength(5)
})
现在您知道如何测试任何依赖于网络的东西,从单个组件到整个应用程序!
接下来我们将讨论一些针对 Mirage 模拟服务器进行断言的常见方法。