斷言 API
Vitest 捆綁了 @testing-library/jest-dom 函式庫,以提供隨裝即用的各種 DOM 斷言。如需詳細的文件,您可以閱讀 jest-dom 的 README:
toBeDisabledtoBeEnabledtoBeEmptyDOMElementtoBeInTheDocumenttoBeInvalidtoBeRequiredtoBeValidtoBeVisibletoContainElementtoContainHTMLtoHaveAccessibleDescriptiontoHaveAccessibleErrorMessagetoHaveAccessibleNametoHaveAttributetoHaveClasstoHaveFocustoHaveFormValuestoHaveStyletoHaveTextContenttoHaveValuetoHaveDisplayValuetoBeCheckedtoBePartiallyCheckedtoHaveRoletoHaveErrorMessage
如果您使用 TypeScript 或希望在 expect 中取得正確的型別提示,請確保您的 tsconfig 中指定了 @vitest/browser/providers/playwright 或 @vitest/browser/providers/webdriverio,具體取決於您使用的提供者。如果您使用預設的 preview 提供者,則可以改為指定 @vitest/browser/matchers。
json
{
"compilerOptions": {
"types": ["@vitest/browser/matchers"]
}
}json
{
"compilerOptions": {
"types": ["@vitest/browser/providers/playwright"]
}
}json
{
"compilerOptions": {
"types": ["@vitest/browser/providers/webdriverio"]
}
}瀏覽器中的測試由於其非同步特性,可能會出現不一致的失敗。因此,重要的是要有一種方法來確保即使條件延遲(例如,由於超時、網路請求或動畫),斷言也能成功。為此,Vitest 透過 expect.poll 和 expect.element API 隨裝即用提供了可重試的斷言:
ts
import { expect, test } from 'vitest';
import { page } from '@vitest/browser/context';
test('error banner is rendered', async () => {
triggerError();
// @testing-library 提供了內建重試機制的查詢方法
// 它會持續尋找 banner 直到其被渲染
const banner = page.getByRole('alert', {
name: /error/i,
});
// Vitest 提供了內建重試機制的 `expect.element`
// 它會持續檢查 `element.textContent` 直到其等於 "Error!"
await expect.element(banner).toHaveTextContent('Error!');
});TIP
expect.element 是 expect.poll(() => element) 的縮寫,其運作方式完全相同。
toHaveTextContent 和所有其他 @testing-library/jest-dom 斷言仍然可以在沒有內建重試機制的常規 expect 上使用:
ts
// 如果 .textContent 不等於 `'Error!'`,將立即失敗
expect(banner).toHaveTextContent('Error!');