测试

使用 Vitest 测试服务器路由、插件和运行时工具。

Vitest 会从你的 Vite 配置中获取 nitro() 插件。测试文件会在 nitro Vite 环境中运行,因此 nitro/* 运行时工具、路由、插件和运行时配置的工作方式与你的服务器代码一致。

#设置

将 vitest 安装为开发依赖:

npm i -D vitest

只要 vite.config.ts(或 vitest.config.ts)中注册了 nitro() 插件,就无需额外配置。只有 nitro.config.ts 的项目需要添加一个配置文件:

vite.config.ts
import { defineConfig } from "vite";
import { nitro } from "nitro/vite";

export default defineConfig({
  plugins: [nitro()],
});

然后运行 vitest。

#编写测试

使用 serverFetch 向 Nitro 应用发送请求,并直接调用运行时工具:

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 插件导入的模块:测试文件注册 mock 后才会创建应用。

Read more in Examples > Vitest.

#监听模式

在监听模式下,编辑路由、中间件或插件会重新运行使用该应用的测试。新增或移除这些文件时,会先重新扫描服务器目录;修改 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":

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 选项(包括预设设置的选项,例如 Cloudflare 的 miniflare)不会生效,因此无法使用平台模块和绑定(例如 cloudflare:workers)。