测试
使用 Vitest 测试服务器路由、插件和运行时工具。
Vitest 会从你的 Vite 配置中获取 nitro() 插件。测试文件会在 nitro Vite 环境中运行,因此 nitro/* 运行时工具、路由、插件和运行时配置的工作方式与你的服务器代码一致。
#设置
将 vitest 安装为开发依赖:
npm i -D vitest只要 vite.config.ts(或 vitest.config.ts)中注册了 nitro() 插件,就无需额外配置。只有 nitro.config.ts 的项目需要添加一个配置文件:
import { defineConfig } from "vite";
import { nitro } from "nitro/vite";
export default defineConfig({
plugins: [nitro()],
});然后运行 vitest。
#编写测试
使用 serverFetch 向 Nitro 应用发送请求,并直接调用运行时工具:
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 插件导入的模块:测试文件注册 mock 后才会创建应用。
#监听模式
在监听模式下,编辑路由、中间件或插件会重新运行使用该应用的测试。新增或移除这些文件时,会先重新扫描服务器目录;修改 Nitro 配置则会重启 Vitest。
#SSR 入口
由 SSR 入口(entry-server.ts)渲染的页面也可以与 serverFetch 配合使用。在测试中,ssr 等服务入口会加载到 nitro 环境,而不是各自的环境中,因此仅适用于该环境的插件和选项不会生效。
目前尚不支持依赖多个服务器环境的框架(例如 React Server Components)。
#选择环境
未设置 test.environment 时会使用 nitro 测试环境。若要使用其他环境,请设置 test.environment,并通过 // @vitest-environment nitro 注释为个别文件重新启用 nitro 环境;也可以反向设置。
在 test.projects 中内联定义的项目不会继承默认环境。请为每个运行服务器测试的项目设置 environment: "nitro":
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和vmForkspool 不支持nitro环境。- 测试始终在 Node.js 中运行:
devServer.runner选项(包括预设设置的选项,例如 Cloudflare 的miniflare)不会生效,因此无法使用平台模块和绑定(例如cloudflare:workers)。