Skip to content
Vitest 3
Main Navigation 指南 & API配置瀏覽器模式進階 API
3.2.0
2.1.9
1.6.1
0.34.6

繁體中文

English
简体中文
Español
Français
Русский
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

繁體中文

English
简体中文
Español
Français
Русский
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

外觀

Sidebar Navigation

API

Node API

進階 API

Vitest API

TestProject

TestSpecification

Test Task API

TestCase

TestSuite

TestModule

TestCollection

插件 API

執行器 API

報告器 API

任務中繼資料

指南

執行測試

擴展報告器

自訂 Pool

配置參考

測試 API 參考

本頁導覽

TestProject 3.0.0+ ​

WARNING

本指南說明進階的 Node.js API。如果您僅需定義專案,請參閱「測試專案」指南。

name ​

名稱是一個由使用者指定或由 Vitest 解析的唯一字串。若使用者未提供名稱,Vitest 會嘗試在專案根目錄中載入 package.json 並取得其 name 屬性。如果沒有 package.json,Vitest 預設會使用資料夾的名稱。行內專案則使用數字作為名稱(轉換為字串)。

ts
import { createVitest } from 'vitest/node';

const vitest = await createVitest('test');
vitest.projects.map(p => p.name) === ['@pkg/server', 'utils', '2', 'custom'];
ts
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    projects: [
      './packages/server', // 包含 package.json,其中有 "@pkg/server"
      './utils', // 沒有 package.json 檔案
      {
        // 不自訂名稱
        test: {
          pool: 'threads',
        },
      },
      {
        // 自訂名稱
        test: {
          name: 'custom',
        },
      },
    ],
  },
});

INFO

如果根專案不屬於使用者專案的一部分,則其 name 將不會被解析。

vitest ​

vitest 參考全域的 Vitest 實例。

serializedConfig ​

這是測試程序接收的配置。Vitest 會手動序列化配置,移除所有無法序列化的函數和屬性。由於此值在測試環境和 Node.js 環境中皆可使用,其類型會從主入口點匯出。

ts
import type { SerializedConfig } from 'vitest';

const config: SerializedConfig = vitest.projects[0].serializedConfig;

WARNING

serializedConfig 屬性是一個 getter。每次存取時,Vitest 都會重新序列化配置,以防其已變更。這也表示它總是返回不同的參考:

ts
project.serializedConfig === project.serializedConfig; // ❌

globalConfig ​

初始化 Vitest 時的測試配置。如果這是根專案,globalConfig 和 config 將指向相同的物件。此配置對於無法在專案層級設定的值很有用,例如 coverage 或 reporters。

ts
import type { ResolvedConfig } from 'vitest/node';

vitest.config === vitest.projects[0].globalConfig;

config ​

這是專案解析後的測試配置。

hash 3.2.0+ ​

此專案的唯一雜湊碼。此值在重新執行時保持一致。

它基於專案的根目錄及其名稱。請注意,根路徑在不同作業系統之間可能不一致,因此雜湊碼也會有所不同。

vite ​

這是專案的 ViteDevServer 實例。所有專案都有其獨立的 Vite 伺服器。

browser ​

此值僅在測試於瀏覽器中執行時設定。如果 browser 已啟用,但測試尚未執行,則此值將為 undefined。如果您需要檢查專案是否支援瀏覽器測試,請使用 project.isBrowserEnabled() 方法。

WARNING

瀏覽器 API 仍處於實驗階段,不遵循 SemVer。瀏覽器 API 將與其他 API 分開標準化。

provide ​

ts
function provide<T extends keyof ProvidedContext & string>(
  key: T,
  value: ProvidedContext[T]
): void;

除了 config.provide 欄位外,此方法還能為測試提供自訂值。所有值在儲存之前都會使用 structuredClone 進行驗證,但 providedContext 本身的值不會被複製。

ts
import { createVitest } from 'vitest/node';

const vitest = await createVitest('test');
const project = vitest.projects.find(p => p.name === 'custom');
project.provide('key', 'value');
await vitest.start();
ts
import { inject } from 'vitest';
const value = inject('key');

這些值可以動態提供。測試中提供的值將在下次執行時更新。

TIP

此方法也適用於全域設定檔,適用於無法使用公開 API 的情況:

js
export default function setup({ provide }) {
  provide('wsPort', 3000);
}

getProvidedContext ​

ts
function getProvidedContext(): ProvidedContext;

此方法會回傳上下文物件。每個專案也會繼承由 vitest.provide 設定的全域上下文。

ts
import { createVitest } from 'vitest/node';

const vitest = await createVitest('test');
vitest.provide('global', true);
const project = vitest.projects.find(p => p.name === 'custom');
project.provide('key', 'value');

// { global: true, key: 'value' }
const context = project.getProvidedContext();

TIP

專案上下文值將始終覆寫根專案的上下文。

createSpecification ​

ts
function createSpecification(
  moduleId: string,
  locations?: number[]
): TestSpecification;

建立一個可用於 vitest.runTestSpecifications 的測試規格。規格會將測試檔案限定於特定的 project 和可選的測試 locations。測試位置是原始碼中定義測試的程式碼行。如果提供了位置,Vitest 將只執行在這些行上定義的測試。請注意,如果定義了 testNamePattern,則也會應用它。

ts
import { createVitest } from 'vitest/node';
import { resolve } from 'node:path/posix';

const vitest = await createVitest('test');
const project = vitest.projects[0];
const specification = project.createSpecification(
  resolve('./example.test.ts'),
  [20, 40] // 可選的測試行
);
await vitest.runTestSpecifications([specification]);

WARNING

createSpecification 預期已解析的模組 ID。它不會自動解析檔案,也不會檢查檔案系統上是否存在。

另請注意,project.createSpecification 總是返回一個新實例。

isRootProject ​

ts
function isRootProject(): boolean;

檢查目前專案是否為根專案。您也可以透過呼叫 vitest.getRootProject() 取得根專案。

globTestFiles ​

ts
function globTestFiles(filters?: string[]): {
  /**
   * 符合篩選條件的測試檔案。
   */
  testFiles: string[];
  /**
   * 符合篩選條件的類型檢查測試檔案。除非 `typecheck.enabled` 為 `true`,否則此為空。
   */
  typecheckTestFiles: string[];
};

全域搜尋所有測試檔案。此函式會回傳一個包含一般測試和類型檢查測試的物件。

此方法接受 filters 參數。篩選條件只能是檔案路徑的一部分,與 Vitest 實例上的其他方法不同:

js
project.globTestFiles(['foo']); // ✅
project.globTestFiles(['basic/foo.js:10']); // ❌

TIP

Vitest 使用 fast-glob 來尋找測試檔案。test.dir、test.root、root 或 process.cwd() 定義 cwd 選項。

此方法會查看多個設定選項:

  • test.include、test.exclude 用於尋找一般測試檔案
  • test.includeSource、test.exclude 用於尋找行內測試
  • test.typecheck.include、test.typecheck.exclude 用於尋找類型檢查測試

matchesTestGlob ​

ts
function matchesTestGlob(moduleId: string, source?: () => string): boolean;

此方法會檢查檔案是否為一般測試檔案。它使用與 globTestFiles 相同的設定屬性進行驗證。

此方法也接受第二個參數,即原始碼。這用於驗證檔案是否為行內測試。如果您多次為多個專案呼叫此方法,建議一次讀取檔案並直接傳遞。如果檔案不是測試檔案,但符合 includeSource 全域模式,Vitest 將同步讀取檔案,除非提供了 source。

ts
import { createVitest } from 'vitest/node';
import { resolve } from 'node:path/posix';

const vitest = await createVitest('test');
const project = vitest.projects[0];

project.matchesTestGlob(resolve('./basic.test.ts')); // true
project.matchesTestGlob(resolve('./basic.ts')); // false
project.matchesTestGlob(
  resolve('./basic.ts'),
  () => `
if (import.meta.vitest) {
  // ...
}
`
); // 如果設定了 `includeSource` 則為 true

import ​

ts
function import<T>(moduleId: string): Promise<T>

使用 Vite 模組執行器匯入檔案。檔案將由 Vite 使用提供的專案設定進行轉換,並在單獨的上下文中執行。請注意,moduleId 將相對於 config.root。

DANGER

project.import 複用 Vite 的模組圖,因此使用常規匯入匯入相同的模組將回傳不同的模組:

ts
import * as staticExample from './example.js';
const dynamicExample = await project.import('./example.js');

dynamicExample !== staticExample; // ✅

INFO

在內部,Vitest 使用此方法匯入全域設定、自訂覆蓋率提供者和自訂報告器,這表示只要它們屬於同一個 Vite 伺服器,它們就共享相同的模組圖。

onTestsRerun ​

ts
function onTestsRerun(cb: OnTestsRerunHandler): void;

這是 project.vitest.onTestsRerun 的簡寫。它接受一個回調函數,當測試被排程重新執行時(通常是由於檔案變更),該回調函數將被等待。

ts
project.onTestsRerun(specs => {
  console.log(specs);
});

isBrowserEnabled ​

ts
function isBrowserEnabled(): boolean;

如果此專案在瀏覽器中執行測試,則返回 true。

close ​

ts
function close(): Promise<void>;

關閉專案和所有相關資源。此方法只能呼叫一次;關閉承諾會被快取,直到伺服器重新啟動。如果再次需要資源,請建立一個新專案。

具體來說,此方法會關閉 Vite 伺服器、停止類型檢查服務、關閉瀏覽器(如果正在執行)、刪除包含原始碼的臨時目錄,並重設提供的上下文。

Pager
上一頁Vitest API
下一頁TestSpecification

以 MIT 授權條款 發布。

版權所有 (c) 2021-Present Vitest Team

https://vitest.dev/advanced/api/test-project

以 MIT 授權條款 發布。

版權所有 (c) 2021-Present Vitest Team