Node API
WARNING
Vitest 暴露了实验性的私有 API。重大更改可能不遵循 SemVer,使用时请锁定 Vitest 的版本。
startVitest
你可以使用 Node API 运行 Vitest 测试:
import { startVitest } from 'vitest/node';
const vitest = await startVitest('test');
await vitest?.close();
startVitest
函数会在可以启动测试时返回一个 Vitest
实例。如果出现以下任一情况,它将返回 undefined
:
- Vitest 未找到
vite
包(通常与 Vitest 一起安装)。 - 启用了覆盖率,且运行模式为 "test",但未安装覆盖率包(
@vitest/coverage-v8
或@vitest/coverage-istanbul
)。 - 未安装环境包(
jsdom
/happy-dom
/@edge-runtime/vm
)。
如果返回 undefined
或测试在运行期间失败,Vitest 会将 process.exitCode
设置为 1
。
如果未启用监听模式,Vitest 将调用 close
方法。
如果启用了监听模式并且终端支持 TTY,Vitest 将注册控制台快捷方式。
你可以将一个过滤器列表作为第二个参数传递。Vitest 将仅运行文件路径中包含至少一个传入字符串的测试。
此外,你可以使用第三个参数传入 CLI 参数,这将覆盖任何测试配置选项。
或者,你可以将完整的 Vite 配置作为第四个参数传入,这将优先于任何其他用户定义的选项。
运行测试后,你可以从 state.getFiles
API 获取结果:
const vitest = await startVitest('test');
console.log(vitest.state.getFiles()); // [{ type: 'file', ... }]
自 Vitest 2.1 起,建议将 state.getFiles
与 "Reported Tasks" API 一起使用。将来,Vitest 将直接返回这些对象:
const vitest = await startVitest('test');
const [fileTask] = vitest.state.getFiles();
const testFile = vitest.state.getReportedEntity(fileTask);
createVitest
你可以使用 createVitest
函数自行创建 Vitest 实例。它会返回与 startVitest
相同的 Vitest
实例,但它不启动测试,也不验证已安装的包。
import { createVitest } from 'vitest/node';
const vitest = await createVitest('test', {
watch: false,
});
parseCLI
你可以使用此方法解析 CLI 参数。它接受一个字符串(其中参数由单个空格分隔)或一个字符串数组,其格式与 Vitest CLI 使用的格式相同。它返回一个过滤器和 options
,你可以稍后将其传递给 createVitest
或 startVitest
方法。
import { parseCLI } from 'vitest/node';
parseCLI('vitest ./files.ts --coverage --browser=chrome');
Vitest
Vitest 实例需要指定当前的测试模式。它可以是:
test
:运行单元测试时benchmark
:运行基准测试时
mode
test
测试模式只会执行 test
或 it
中的函数,并在遇到 bench
时抛出错误。此模式使用配置中的 include
和 exclude
选项来查找测试文件。
benchmark
基准测试模式会调用 bench
函数,并在遇到 test
或 it
时抛出错误。此模式使用配置中的 benchmark.include
和 benchmark.exclude
选项来查找基准测试文件。
start
你可以通过 start
方法开始运行测试或基准测试。你可以传递一个字符串数组来过滤测试文件。
provide
Vitest 公开了 provide
方法,它是 vitest.getCoreWorkspaceProject().provide
的简写形式。通过此方法,你可以将值从主线程传递到测试中。所有值在存储之前都会使用 structuredClone
进行检查,但值本身不会被克隆。
要在测试中接收这些值,你需要从 vitest
入口点导入 inject
方法:
import { inject } from 'vitest';
const port = inject('wsPort'); // 3000
为了更好地保证类型安全,我们建议你扩展 ProvidedContext
的类型:
import { createVitest } from 'vitest/node';
const vitest = await createVitest('test', {
watch: false,
});
vitest.provide('wsPort', 3000);
declare module 'vitest' {
export interface ProvidedContext {
wsPort: number;
}
}
WARNING
严格来说,provide
是 WorkspaceProject
的方法,因此它仅适用于特定项目。但是,所有项目都继承了核心项目的值,这使得 vitest.provide
成为将值传递给测试的通用方法。
TIP
对于不需要使用公共 API 的情况,此方法也可以用于 全局设置文件:
export default function setup({ provide }) {
provide('wsPort', 3000);
}