# 测试 > 使用 Vitest 测试服务器路由、插件和运行时工具。 [Vitest](https://vitest.dev) 会从你的 Vite 配置中获取 `nitro()` 插件。测试文件会在 `nitro` Vite 环境中运行,因此 `nitro/*` 运行时工具、路由、插件和运行时配置的工作方式与你的服务器代码一致。 ## 设置 将 `vitest` 安装为开发依赖: :pm-install{name="-D vitest"} 只要 `vite.config.ts`(或 `vitest.config.ts`)中注册了 `nitro()` 插件,就无需额外配置。只有 `nitro.config.ts` 的项目需要添加一个配置文件: ```ts [vite.config.ts] import { defineConfig } from "vite"; import { nitro } from "nitro/vite"; export default defineConfig({ plugins: [nitro()], }); ``` 然后运行 `vitest`。 ## 编写测试 使用 `serverFetch` 向 Nitro 应用发送请求,并直接调用运行时工具: ```ts [test/app.test.ts] import { expect, test } from "vitest"; import { serverFetch } from "nitro"; import { useKV } from "nitro/kv"; test("GET /api/hello", async () => { const res = await serverFetch("/api/hello"); expect(await res.json()).toEqual({ hello: "world" }); }); test("kv", async () => { await useKV().setItem("foo", "bar"); expect(await useKV().getItem("foo")).toBe("bar"); }); ``` 测试会在 Vitest worker 中运行,不会启动 Nitro 开发服务器。使用 Vitest 默认的隔离设置时,每个测试文件都会获得自己的 Nitro 应用实例,并在文件运行结束时执行其 `close` 钩子。 `vi.mock` 的用法与平常相同,包括 mock 路由和 [Nitro 插件](/docs/plugins)导入的模块:测试文件注册 mock 后才会创建应用。 ::read-more{to="/examples/vitest"} 请参阅 [Vitest 示例](/examples/vitest)了解完整项目。 :: ## 监听模式 在监听模式下,编辑路由、中间件或插件会重新运行使用该应用的测试。新增或移除这些文件时,会先重新扫描服务器目录;修改 Nitro 配置则会重启 Vitest。 ## SSR 入口 由 [SSR 入口](/docs/vite#frontend-frameworks)(`entry-server.ts`)渲染的页面也可以与 `serverFetch` 配合使用。在测试中,`ssr` 等服务入口会加载到 `nitro` 环境,而不是各自的环境中,因此仅适用于该环境的插件和选项不会生效。 目前尚不支持依赖多个服务器环境的框架(例如 React Server Components)。 ## 选择环境 未设置 `test.environment` 时会使用 `nitro` 测试环境。若要使用其他环境,请设置 `test.environment`,并通过 `// @vitest-environment nitro` 注释为个别文件重新启用 `nitro` 环境;也可以反向设置。 在 `test.projects` 中内联定义的项目不会继承默认环境。请为每个运行服务器测试的项目设置 `environment: "nitro"`: ```ts [vite.config.ts] import { defineConfig } from "vitest/config"; import { nitro } from "nitro/vite"; export default defineConfig({ plugins: [nitro()], test: { projects: [{ extends: true, test: { name: "server", environment: "nitro" } }], }, }); ``` ## 限制 - `vmThreads` 和 `vmForks` pool 不支持 `nitro` 环境。 - 测试始终在 Node.js 中运行:[`devServer.runner`](/config#devserver) 选项(包括预设设置的选项,例如 Cloudflare 的 `miniflare`)不会生效,因此无法使用平台模块和绑定(例如 `cloudflare:workers`)。