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

簡介

為何選擇 Vitest

快速入門

功能特色

配置參考

API

測試 API 參考

模擬函式

Vi

expect

expectTypeOf

assert

assertType

指南

命令列介面

測試篩選

測試專案

報告器

程式碼覆蓋率

快照

模擬(Mocking)

平行化

型別測試

Vitest UI

內聯測試

測試上下文

測試註解

測試環境

擴展匹配器

IDE 整合

偵錯

常見錯誤

遷移指南

遷移到 Vitest 3.0

從 Jest 遷移

效能

測試效能分析

提升效能

瀏覽器模式

進階 API

與其他測試執行器的比較

本頁導覽

assert ​

Vitest 重新導出 chai 的 assert 方法,用於驗證不變性。

assert ​

  • 類型: (expression: any, message?: string) => asserts expression

斷言給定的 expression 為真值,否則斷言將會失敗。

ts
import { assert, test } from 'vitest';

test('assert', () => {
  assert('foo' !== 'bar', 'foo 不應該等於 bar');
});

fail ​

  • 類型:
    • (message?: string) => never
    • <T>(actual: T, expected: T, message?: string, operator?: string) => never

強制使斷言失敗。

ts
import { assert, test } from 'vitest';

test('assert.fail', () => {
  assert.fail('失敗時的錯誤訊息');
  assert.fail('foo', 'bar', 'foo 不是 bar', '===');
});

isOk ​

  • 類型: <T>(value: T, message?: string) => void
  • 別名 ok

斷言給定的 value 為真值。

ts
import { assert, test } from 'vitest';

test('assert.isOk', () => {
  assert.isOk('foo', '任何真值都是有效的');
  assert.isOk(false, '這會失敗,因為 false 不是真值');
});

isNotOk ​

  • 類型: <T>(value: T, message?: string) => void
  • 別名 notOk

斷言給定的 value 為假值。

ts
import { assert, test } from 'vitest';

test('assert.isNotOk', () => {
  assert.isNotOk('foo', '這將失敗,因為任何真值都不應被視為無效');
  assert.isNotOk(false, '這會通過,因為 false 是假值');
});

equal ​

  • 類型: <T>(actual: T, expected: T, message?: string) => void

斷言 actual 和 expected 的非嚴格相等 (==)。

ts
import { assert, test } from 'vitest';

test('assert.equal', () => {
  assert.equal(Math.sqrt(4), '2');
});

notEqual ​

  • 類型: <T>(actual: T, expected: T, message?: string) => void

斷言 actual 和 expected 的非嚴格不相等 (!=)。

ts
import { assert, test } from 'vitest';

test('assert.notEqual', () => {
  assert.notEqual(Math.sqrt(4), 3);
});

strictEqual ​

  • 類型: <T>(actual: T, expected: T, message?: string) => void

斷言 actual 和 expected 的嚴格相等 (===)。

ts
import { assert, test } from 'vitest';

test('assert.strictEqual', () => {
  assert.strictEqual(Math.sqrt(4), 2);
});

deepEqual ​

  • 類型: <T>(actual: T, expected: T, message?: string) => void

斷言 actual 與 expected 深度相等。

ts
import { assert, test } from 'vitest';

test('assert.deepEqual', () => {
  assert.deepEqual({ color: 'green' }, { color: 'green' });
});

notDeepEqual ​

  • 類型: <T>(actual: T, expected: T, message?: string) => void

斷言 actual 與 expected 不深度相等。

ts
import { assert, test } from 'vitest';

test('assert.notDeepEqual', () => {
  assert.notDeepEqual({ color: 'green' }, { color: 'red' });
});

isAbove ​

  • 類型: (valueToCheck: number, valueToBeAbove: number, message?: string) => void

斷言 valueToCheck 嚴格大於 (>) valueToBeAbove。

ts
import { assert, test } from 'vitest';

test('assert.isAbove', () => {
  assert.isAbove(5, 2, '5 嚴格大於 2');
});

isAtLeast ​

  • 類型: (valueToCheck: number, valueToBeAtLeast: number, message?: string) => void

斷言 valueToCheck 大於或等於 (>=) valueToBeAtLeast。

ts
import { assert, test } from 'vitest';

test('assert.isAtLeast', () => {
  assert.isAtLeast(5, 2, '5 大於或等於 2');
  assert.isAtLeast(3, 3, '3 大於或等於 3');
});

isBelow ​

  • 類型: (valueToCheck: number, valueToBeBelow: number, message?: string) => void

斷言 valueToCheck 嚴格小於 (<) valueToBeBelow。

ts
import { assert, test } from 'vitest';

test('assert.isBelow', () => {
  assert.isBelow(3, 6, '3 嚴格小於 6');
});

isAtMost ​

  • 類型: (valueToCheck: number, valueToBeAtMost: number, message?: string) => void

斷言 valueToCheck 小於或等於 (<=) valueToBeAtMost。

ts
import { assert, test } from 'vitest';

test('assert.isAtMost', () => {
  assert.isAtMost(3, 6, '3 小於或等於 6');
  assert.isAtMost(4, 4, '4 小於或等於 4');
});

isTrue ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 是 true。

ts
import { assert, test } from 'vitest';

const testPassed = true;

test('assert.isTrue', () => {
  assert.isTrue(testPassed);
});

isNotTrue ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 不是 true。

ts
import { assert, test } from 'vitest';

const testPassed = 'ok';

test('assert.isNotTrue', () => {
  assert.isNotTrue(testPassed);
});

isFalse ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 是 false。

ts
import { assert, test } from 'vitest';

const testPassed = false;

test('assert.isFalse', () => {
  assert.isFalse(testPassed);
});

isNotFalse ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 不是 false。

ts
import { assert, test } from 'vitest';

const testPassed = 'no';

test('assert.isNotFalse', () => {
  assert.isNotFalse(testPassed);
});

isNull ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 是 null。

ts
import { assert, test } from 'vitest';

const error = null;

test('assert.isNull', () => {
  assert.isNull(error, '錯誤是 null');
});

isNotNull ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 不是 null。

ts
import { assert, test } from 'vitest';

const error = { message: 'error was occurred' };

test('assert.isNotNull', () => {
  assert.isNotNull(error, '錯誤不是 null,而是物件');
});

isNaN ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 是 NaN。

ts
import { assert, test } from 'vitest';

const calculation = 1 * 'vitest';

test('assert.isNaN', () => {
  assert.isNaN(calculation, '1 * "vitest" 是 NaN');
});

isNotNaN ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 不是 NaN。

ts
import { assert, test } from 'vitest';

const calculation = 1 * 2;

test('assert.isNotNaN', () => {
  assert.isNotNaN(calculation, '1 * 2 不是 NaN,而是 2');
});

exists ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 既非 null 也非 undefined。

ts
import { assert, test } from 'vitest';

const name = 'foo';

test('assert.exists', () => {
  assert.exists(name, 'foo 既非 null 也非 undefined');
});

notExists ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 為 null 或 undefined。

ts
import { assert, test } from 'vitest';

const foo = null;
const bar = undefined;

test('assert.notExists', () => {
  assert.notExists(foo, 'foo 是 null,所以不存在');
  assert.notExists(bar, 'bar 是 undefined,所以不存在');
});

isUndefined ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 是 undefined。

ts
import { assert, test } from 'vitest';

const name = undefined;

test('assert.isUndefined', () => {
  assert.isUndefined(name, 'name 是 undefined');
});

isDefined ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 不是 undefined。

ts
import { assert, test } from 'vitest';

const name = 'foo';

test('assert.isDefined', () => {
  assert.isDefined(name, 'name 不是 undefined');
});

isFunction ​

  • 類型: <T>(value: T, message?: string) => void
  • 別名: isCallable 斷言 value 是一個函數。
ts
import { assert, test } from 'vitest';

function name() {
  return 'foo';
}

test('assert.isFunction', () => {
  assert.isFunction(name, 'name 是一個函數');
});

isNotFunction ​

  • 類型: <T>(value: T, message?: string) => void
  • 別名: isNotCallable

斷言 value 不是一個函數。

ts
import { assert, test } from 'vitest';

const name = 'foo';

test('assert.isNotFunction', () => {
  assert.isNotFunction(name, 'name 不是函數,而是字串');
});

isObject ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 是一個 Object 類型的物件(由 Object.prototype.toString 揭示)。此斷言不適用於子類物件。

ts
import { assert, test } from 'vitest';

const someThing = { color: 'red', shape: 'circle' };

test('assert.isObject', () => {
  assert.isObject(someThing, 'someThing 是一個物件');
});

isNotObject ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 不是一個 Object 類型的物件(由 Object.prototype.toString 揭示)。此斷言不適用於子類物件。

ts
import { assert, test } from 'vitest';

const someThing = 'redCircle';

test('assert.isNotObject', () => {
  assert.isNotObject(someThing, 'someThing 不是物件,而是字串');
});

isArray ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 是一個陣列。

ts
import { assert, test } from 'vitest';

const color = ['red', 'green', 'yellow'];

test('assert.isArray', () => {
  assert.isArray(color, 'color 是一個陣列');
});

isNotArray ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 不是一個陣列。

ts
import { assert, test } from 'vitest';

const color = 'red';

test('assert.isNotArray', () => {
  assert.isNotArray(color, 'color 不是陣列,而是字串');
});

isString ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 是一個字串。

ts
import { assert, test } from 'vitest';

const color = 'red';

test('assert.isString', () => {
  assert.isString(color, 'color 是一個字串');
});

isNotString ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 不是一個字串。

ts
import { assert, test } from 'vitest';

const color = ['red', 'green', 'yellow'];

test('assert.isNotString', () => {
  assert.isNotString(color, 'color 不是字串,而是陣列');
});

isNumber ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 是一個數字。

ts
import { assert, test } from 'vitest';

const colors = 3;

test('assert.isNumber', () => {
  assert.isNumber(colors, 'colors 是一個數字');
});

isNotNumber ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 不是一個數字。

ts
import { assert, test } from 'vitest';

const colors = '3 colors';

test('assert.isNotNumber', () => {
  assert.isNotNumber(colors, 'colors 不是數字,而是字串');
});

isFinite ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 是一個有限數字(不是 NaN、Infinity)。

ts
import { assert, test } from 'vitest';

const colors = 3;

test('assert.isFinite', () => {
  assert.isFinite(colors, 'colors 是數字,不是 NaN 或 Infinity');
});

isBoolean ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 是一個布林值。

ts
import { assert, test } from 'vitest';

const isReady = true;

test('assert.isBoolean', () => {
  assert.isBoolean(isReady, 'isReady 是一個布林值');
});

isNotBoolean ​

  • 類型: <T>(value: T, message?: string) => void

斷言 value 不是一個布林值。

ts
import { assert, test } from 'vitest';

const isReady = 'sure';

test('assert.isNotBoolean', () => {
  assert.isNotBoolean(isReady, 'isReady 不是布林值,而是字串');
});

typeOf ​

  • 類型: <T>(value: T, name: string, message?: string) => void

斷言 value 的類型為 name,此類型由 Object.prototype.toString 確定。

ts
import { assert, test } from 'vitest';

test('assert.typeOf', () => {
  assert.typeOf({ color: 'red' }, 'object', '我們有一個物件');
  assert.typeOf(['red', 'green'], 'array', '我們有一個陣列');
  assert.typeOf('red', 'string', '我們有一個字串');
  assert.typeOf(/red/, 'regexp', '我們有一個正則表達式');
  assert.typeOf(null, 'null', '我們有一個 null');
  assert.typeOf(undefined, 'undefined', '我們有一個 undefined');
});

notTypeOf ​

  • 類型: <T>(value: T, name: string, message?: string) => void

斷言 value 的類型不是 name,此類型由 Object.prototype.toString 確定。

ts
import { assert, test } from 'vitest';

test('assert.notTypeOf', () => {
  assert.notTypeOf('red', 'number', '"red" 不是一個數字');
});

instanceOf ​

  • 類型: <T>(value: T, constructor: Function, message?: string) => void

斷言 value 是 constructor 的一個實例。

ts
import { assert, test } from 'vitest';

function Person(name) {
  this.name = name;
}
const foo = new Person('foo');

class Tea {
  constructor(name) {
    this.name = name;
  }
}
const coffee = new Tea('coffee');

test('assert.instanceOf', () => {
  assert.instanceOf(foo, Person, 'foo 是 Person 的一個實例');
  assert.instanceOf(coffee, Tea, 'coffee 是 Tea 的一個實例');
});

notInstanceOf ​

  • 類型: <T>(value: T, constructor: Function, message?: string) => void

斷言 value 不是 constructor 的一個實例。

ts
import { assert, test } from 'vitest';

function Person(name) {
  this.name = name;
}
const foo = new Person('foo');

class Tea {
  constructor(name) {
    this.name = name;
  }
}
const coffee = new Tea('coffee');

test('assert.notInstanceOf', () => {
  assert.notInstanceOf(foo, Tea, 'foo 不是 Tea 的一個實例');
});

include ​

  • 類型:
    • (haystack: string, needle: string, message?: string) => void
    • <T>(haystack: readonly T[] | ReadonlySet<T> | ReadonlyMap<any, T>, needle: T, message?: string) => void
    • <T extends object>(haystack: WeakSet<T>, needle: T, message?: string) => void
    • <T>(haystack: T, needle: Partial<T>, message?: string) => void

斷言 haystack 包含 needle。此方法可用於斷言陣列中包含某個值、字串中包含子字串,或物件中包含屬性子集。

ts
import { assert, test } from 'vitest';

test('assert.include', () => {
  assert.include([1, 2, 3], 2, '陣列包含值');
  assert.include('foobar', 'foo', '字串包含子字串');
  assert.include(
    { foo: 'bar', hello: 'universe' },
    { foo: 'bar' },
    '物件包含屬性'
  );
});

notInclude ​

  • 類型:
    • (haystack: string, needle: string, message?: string) => void
    • <T>(haystack: readonly T[] | ReadonlySet<T> | ReadonlyMap<any, T>, needle: T, message?: string) => void
    • <T extends object>(haystack: WeakSet<T>, needle: T, message?: string) => void
    • <T>(haystack: T, needle: Partial<T>, message?: string) => void

斷言 haystack 不包含 needle。此方法可用於斷言陣列中不包含某個值、字串中不包含子字串,或物件中不包含屬性子集。

ts
import { assert, test } from 'vitest';

test('assert.notInclude', () => {
  assert.notInclude([1, 2, 3], 4, "陣列不包含 4");
  assert.notInclude('foobar', 'baz', "foobar 不包含 baz");
  assert.notInclude(
    { foo: 'bar', hello: 'universe' },
    { foo: 'baz' },
    "物件不包含屬性"
  );
});

deepInclude ​

  • 類型:
  • (haystack: string, needle: string, message?: string) => void
  • <T>(haystack: readonly T[] | ReadonlySet<T> | ReadonlyMap<any, T>, needle: T, message?: string) => void
  • <T>(haystack: T, needle: T extends WeakSet<any> ? never : Partial<T>, message?: string) => void

斷言 haystack 包含 needle。此方法可用於斷言陣列中包含某個值或物件中包含屬性子集。使用深度相等檢查。

ts
import { assert, test } from 'vitest';

const obj1 = { a: 1 };
const obj2 = { b: 2 };

test('assert.deepInclude', () => {
  assert.deepInclude([obj1, obj2], { a: 1 });
  assert.deepInclude({ foo: obj1, bar: obj2 }, { foo: { a: 1 } });
});

notDeepInclude ​

  • 類型:
    • (haystack: string, needle: string, message?: string) => void
    • <T>(haystack: readonly T[] | ReadonlySet<T> | ReadonlyMap<any, T>, needle: T, message?: string) => void
    • <T>(haystack: T, needle: T extends WeakSet<any> ? never : Partial<T>, message?: string) => void

斷言 haystack 不包含 needle。此方法可用於斷言陣列中不包含某個值或物件中不包含屬性子集。使用深度相等檢查。

ts
import { assert, test } from 'vitest';

const obj1 = { a: 1 };
const obj2 = { b: 2 };

test('assert.notDeepInclude', () => {
  assert.notDeepInclude([obj1, obj2], { a: 10 });
  assert.notDeepInclude({ foo: obj1, bar: obj2 }, { foo: { a: 10 } });
});

nestedInclude ​

  • 類型: (haystack: any, needle: any, message?: string) => void

斷言 haystack 包含 needle。可用於斷言物件中包含屬性子集。支援使用點和方括號表示法引用巢狀屬性。屬性名稱中的「[]」和「.」可以使用雙反斜線進行轉義。

ts
import { assert, test } from 'vitest';

test('assert.nestedInclude', () => {
  assert.nestedInclude({ '.a': { b: 'x' } }, { '\\.a.[b]': 'x' });
  assert.nestedInclude({ a: { '[b]': 'x' } }, { 'a.\\[b\\]': 'x' });
});

notNestedInclude ​

  • 類型: (haystack: any, needle: any, message?: string) => void

斷言 haystack 不包含 needle。可用於斷言物件中不包含屬性子集。支援使用點和方括號表示法引用巢狀屬性。屬性名稱中的「[]」和「.」可以使用雙反斜線進行轉義。

ts
import { assert, test } from 'vitest';

test('assert.notNestedInclude', () => {
  assert.notNestedInclude({ '.a': { b: 'x' } }, { '\\.a.b': 'y' });
  assert.notNestedInclude({ a: { '[b]': 'x' } }, { 'a.\\[b\\]': 'y' });
});

deepNestedInclude ​

  • 類型: (haystack: any, needle: any, message?: string) => void

斷言 haystack 包含 needle。可用於斷言物件中包含屬性子集,同時檢查深度相等。支援使用點和方括號表示法引用巢狀屬性。屬性名稱中的「[]」和「.」可以使用雙反斜線進行轉義。

ts
import { assert, test } from 'vitest';

test('assert.deepNestedInclude', () => {
  assert.deepNestedInclude({ a: { b: [{ x: 1 }] } }, { 'a.b[0]': { x: 1 } });
  assert.deepNestedInclude(
    { '.a': { '[b]': { x: 1 } } },
    { '\\.a.\\[b\\]': { x: 1 } }
  );
});

notDeepNestedInclude ​

  • 類型: (haystack: any, needle: any, message?: string) => void

斷言 haystack 不包含 needle。可用於斷言物件中不包含屬性子集,同時檢查深度相等。支援使用點和方括號表示法引用巢狀屬性。屬性名稱中的「[]」和「.」可以使用雙反斜線進行轉義。

ts
import { assert, test } from 'vitest';

test('assert.notDeepNestedInclude', () => {
  assert.notDeepNestedInclude({ a: { b: [{ x: 1 }] } }, { 'a.b[0]': { y: 1 } });
  assert.notDeepNestedInclude(
    { '.a': { '[b]': { x: 1 } } },
    { '\\.a.\\[b\\]': { y: 2 } }
  );
});

ownInclude ​

  • 類型: (haystack: any, needle: any, message?: string) => void

斷言 haystack 包含 needle。可用於斷言物件中包含屬性子集,同時忽略繼承的屬性。

ts
import { assert, test } from 'vitest';

test('assert.ownInclude', () => {
  assert.ownInclude({ a: 1 }, { a: 1 });
});

notOwnInclude ​

  • 類型: (haystack: any, needle: any, message?: string) => void

斷言 haystack 不包含 needle。可用於斷言物件中不包含屬性子集,同時忽略繼承的屬性。

ts
import { assert, test } from 'vitest';

const obj1 = {
  b: 2,
};

const obj2 = Object.create(obj1);
obj2.a = 1;

test('assert.notOwnInclude', () => {
  assert.notOwnInclude(obj2, { b: 2 });
});

deepOwnInclude ​

  • 類型: (haystack: any, needle: any, message?: string) => void

斷言 haystack 包含 needle。可用於斷言物件中包含屬性子集,同時忽略繼承的屬性並檢查深度相等。

ts
import { assert, test } from 'vitest';

test('assert.deepOwnInclude', () => {
  assert.deepOwnInclude({ a: { b: 2 } }, { a: { b: 2 } });
});

notDeepOwnInclude ​

  • 類型: (haystack: any, needle: any, message?: string) => void

斷言 haystack 不包含 needle。可用於斷言物件中不包含屬性子集,同時忽略繼承的屬性並檢查深度相等。

ts
import { assert, test } from 'vitest';

test('assert.notDeepOwnInclude', () => {
  assert.notDeepOwnInclude({ a: { b: 2 } }, { a: { c: 3 } });
});

match ​

  • 類型: (value: string, regexp: RegExp, message?: string) => void

斷言 value 匹配正則表達式 regexp。

ts
import { assert, test } from 'vitest';

test('assert.match', () => {
  assert.match('foobar', /^foo/, '正則表達式匹配');
});

notMatch ​

  • 類型: (value: string, regexp: RegExp, message?: string) => void

斷言 value 不匹配正則表達式 regexp。

ts
import { assert, test } from 'vitest';

test('assert.notMatch', () => {
  assert.notMatch('foobar', /^foo/, '正則表達式不匹配');
});

property ​

  • 類型: <T>(object: T, property: string, message?: string) => void

斷言 object 具有由 property 命名的直接或繼承屬性。

ts
import { assert, test } from 'vitest';

test('assert.property', () => {
  assert.property({ tea: { green: 'matcha' } }, 'tea');
  assert.property({ tea: { green: 'matcha' } }, 'toString');
});

notProperty ​

  • 類型: <T>(object: T, property: string, message?: string) => void

斷言 object 不具有由 property 命名的直接或繼承屬性。

ts
import { assert, test } from 'vitest';

test('assert.notProperty', () => {
  assert.notProperty({ tea: { green: 'matcha' } }, 'coffee');
});

propertyVal ​

  • 類型: <T, V>(object: T, property: string, value: V, message?: string) => void

斷言 object 具有由 property 命名的直接或繼承屬性,其值由 value 給定。使用嚴格相等檢查 (===)。

ts
import { assert, test } from 'vitest';

test('assert.propertyVal', () => {
  assert.propertyVal({ tea: 'is good' }, 'tea', 'is good');
});

notPropertyVal ​

  • 類型: <T, V>(object: T, property: string, value: V, message?: string) => void

斷言 object 不具有由 property 命名的直接或繼承屬性,其值由 value 給定。使用嚴格相等檢查 (===)。

ts
import { assert, test } from 'vitest';

test('assert.notPropertyVal', () => {
  assert.notPropertyVal({ tea: 'is good' }, 'tea', 'is bad');
  assert.notPropertyVal({ tea: 'is good' }, 'coffee', 'is good');
});

deepPropertyVal ​

  • 類型: <T, V>(object: T, property: string, value: V, message?: string) => void

斷言 object 具有由 property 命名的直接或繼承屬性,其值由 value 給定。使用深度相等檢查。

ts
import { assert, test } from 'vitest';

test('assert.deepPropertyVal', () => {
  assert.deepPropertyVal({ tea: { green: 'matcha' } }, 'tea', {
    green: 'matcha',
  });
});

notDeepPropertyVal ​

  • 類型: <T, V>(object: T, property: string, value: V, message?: string) => void

斷言 object 不具有由 property 命名的直接或繼承屬性,其值由 value 給定。使用深度相等檢查。

ts
import { assert, test } from 'vitest';

test('assert.notDeepPropertyVal', () => {
  assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'tea', {
    black: 'matcha',
  });
  assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'tea', {
    green: 'oolong',
  });
  assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'coffee', {
    green: 'matcha',
  });
});

nestedProperty ​

  • 類型: <T>(object: T, property: string, message?: string) => void

斷言 object 具有由 property 命名的直接或繼承屬性,property 可以是使用點和方括號表示法進行巢狀引用的字串。

ts
import { assert, test } from 'vitest';

test('assert.nestedProperty', () => {
  assert.nestedProperty({ tea: { green: 'matcha' } }, 'tea.green');
});

notNestedProperty ​

  • 類型: <T>(object: T, property: string, message?: string) => void

斷言 object 不具有由 property 命名的直接或繼承屬性,property 可以是使用點和方括號表示法進行巢狀引用的字串。

ts
import { assert, test } from 'vitest';

test('assert.notNestedProperty', () => {
  assert.notNestedProperty({ tea: { green: 'matcha' } }, 'tea.oolong');
});

nestedPropertyVal ​

  • 類型: <T>(object: T, property: string, value: any, message?: string) => void

斷言 object 具有由 property 命名的屬性,其值由 value 給定。property 可以使用點和方括號表示法進行巢狀引用。使用嚴格相等檢查 (===)。

ts
import { assert, test } from 'vitest';

test('assert.nestedPropertyVal', () => {
  assert.nestedPropertyVal({ tea: { green: 'matcha' } }, 'tea.green', 'matcha');
});

notNestedPropertyVal ​

  • 類型: <T>(object: T, property: string, value: any, message?: string) => void

斷言 object 不具有由 property 命名的屬性,其值由 value 給定。property 可以使用點和方括號表示法進行巢狀引用。使用嚴格相等檢查 (===)。

ts
import { assert, test } from 'vitest';

test('assert.notNestedPropertyVal', () => {
  assert.notNestedPropertyVal(
    { tea: { green: 'matcha' } },
    'tea.green',
    'konacha'
  );
  assert.notNestedPropertyVal(
    { tea: { green: 'matcha' } },
    'coffee.green',
    'matcha'
  );
});

deepNestedPropertyVal ​

  • 類型: <T>(object: T, property: string, value: any, message?: string) => void

斷言 object 具有由 property 命名的屬性,其值由 value 給定。property 可以使用點和方括號表示法進行巢狀引用。使用深度相等檢查。

ts
import { assert, test } from 'vitest';

test('assert.deepNestedPropertyVal', () => {
  assert.deepNestedPropertyVal(
    { tea: { green: 'matcha' } },
    'tea.green',
    'konacha'
  );
  assert.deepNestedPropertyVal(
    { tea: { green: 'matcha' } },
    'coffee.green',
    'matcha'
  );
});

notDeepNestedPropertyVal ​

  • 類型: <T>(object: T, property: string, value: any, message?: string) => void

斷言 object 不具有由 property 命名的屬性,其值由 value 給定。property 可以使用點和方括號表示法進行巢狀引用。使用深度相等檢查。

ts
import { assert, test } from 'vitest';

test('assert.notDeepNestedPropertyVal', () => {
  assert.notDeepNestedPropertyVal(
    { tea: { green: { matcha: 'yum' } } },
    'tea.green',
    { oolong: 'yum' }
  );
  assert.notDeepNestedPropertyVal(
    { tea: { green: { matcha: 'yum' } } },
    'tea.green',
    { matcha: 'yuck' }
  );
  assert.notDeepNestedPropertyVal(
    { tea: { green: { matcha: 'yum' } } },
    'tea.black',
    { matcha: 'yum' }
  );
});

lengthOf ​

  • 類型: <T extends { readonly length?: number | undefined } | { readonly size?: number | undefined }>(object: T, length: number, message?: string) => void

斷言 object 具有預期值的 length 或 size。

ts
import { assert, test } from 'vitest';

test('assert.lengthOf', () => {
  assert.lengthOf([1, 2, 3], 3, '陣列長度為 3');
  assert.lengthOf('foobar', 6, '字串長度為 6');
  assert.lengthOf(new Set([1, 2, 3]), 3, 'set 大小為 3');
  assert.lengthOf(
    new Map([
      ['a', 1],
      ['b', 2],
      ['c', 3],
    ]),
    3,
    'map 大小為 3'
  );
});

hasAnyKeys ​

  • 類型: <T>(object: T, keys: Array<Object | string> | { [key: string]: any }, message?: string) => void

斷言 object 至少具有所提供的 keys 中的一個。您也可以提供單一物件而不是鍵陣列,其鍵將用作預期的鍵集。

ts
import { assert, test } from 'vitest';

test('assert.hasAnyKeys', () => {
  assert.hasAnyKeys({ foo: 1, bar: 2, baz: 3 }, ['foo', 'iDontExist', 'baz']);
  assert.hasAnyKeys(
    { foo: 1, bar: 2, baz: 3 },
    { foo: 30, iDontExist: 99, baz: 1337 }
  );
  assert.hasAnyKeys(
    new Map([
      [{ foo: 1 }, 'bar'],
      ['key', 'value'],
    ]),
    [{ foo: 1 }, 'key']
  );
  assert.hasAnyKeys(new Set([{ foo: 'bar' }, 'anotherKey']), [
    { foo: 'bar' },
    'anotherKey',
  ]);
});

hasAllKeys ​

  • 類型: <T>(object: T, keys: Array<Object | string> | { [key: string]: any }, message?: string) => void

斷言 object 具有所提供的所有 keys,且僅有這些鍵。您也可以提供單一物件而不是鍵陣列,其鍵將用作預期的鍵集。

ts
import { assert, test } from 'vitest';

test('assert.hasAllKeys', () => {
  assert.hasAllKeys({ foo: 1, bar: 2, baz: 3 }, ['foo', 'bar', 'baz']);
  assert.hasAllKeys(
    { foo: 1, bar: 2, baz: 3 },
    { foo: 30, bar: 99, baz: 1337 }
  );
  assert.hasAllKeys(
    new Map([
      [{ foo: 1 }, 'bar'],
      ['key', 'value'],
    ]),
    [{ foo: 1 }, 'key']
  );
  assert.hasAllKeys(
    new Set([{ foo: 'bar' }, 'anotherKey'], [{ foo: 'bar' }, 'anotherKey'])
  );
});

containsAllKeys ​

  • 類型: <T>(object: T, keys: Array<Object | string> | { [key: string]: any }, message?: string) => void

斷言 object 具有所提供的所有 keys,但可能還有未列出的其他鍵。您也可以提供單一物件而不是鍵陣列,其鍵將用作預期的鍵集。

ts
import { assert, test } from 'vitest';

test('assert.containsAllKeys', () => {
  assert.containsAllKeys({ foo: 1, bar: 2, baz: 3 }, ['foo', 'baz']);
  assert.containsAllKeys({ foo: 1, bar: 2, baz: 3 }, ['foo', 'bar', 'baz']);
  assert.containsAllKeys({ foo: 1, bar: 2, baz: 3 }, { foo: 30, baz: 1337 });
  assert.containsAllKeys(
    { foo: 1, bar: 2, baz: 3 },
    { foo: 30, bar: 99, baz: 1337 }
  );
  assert.containsAllKeys(
    new Map([
      [{ foo: 1 }, 'bar'],
      ['key', 'value'],
    ]),
    [{ foo: 1 }]
  );
  assert.containsAllKeys(
    new Map([
      [{ foo: 1 }, 'bar'],
      ['key', 'value'],
    ]),
    [{ foo: 1 }, 'key']
  );
  assert.containsAllKeys(
    new Set([{ foo: 'bar' }, 'anotherKey'], [{ foo: 'bar' }])
  );
  assert.containsAllKeys(
    new Set([{ foo: 'bar' }, 'anotherKey'], [{ foo: 'bar' }, 'anotherKey'])
  );
});

doesNotHaveAnyKeys ​

  • 類型: <T>(object: T, keys: Array<Object | string> | { [key: string]: any }, message?: string) => void

斷言 object 不具有所提供的任何 keys。您也可以提供單一物件而不是鍵陣列,其鍵將用作預期的鍵集。

ts
import { assert, test } from 'vitest';

test('assert.doesNotHaveAnyKeys', () => {
  assert.doesNotHaveAnyKeys({ foo: 1, bar: 2, baz: 3 }, [
    'one',
    'two',
    'example',
  ]);
  assert.doesNotHaveAnyKeys(
    { foo: 1, bar: 2, baz: 3 },
    { one: 1, two: 2, example: 'foo' }
  );
  assert.doesNotHaveAnyKeys(
    new Map([
      [{ foo: 1 }, 'bar'],
      ['key', 'value'],
    ]),
    [{ one: 'two' }, 'example']
  );
  assert.doesNotHaveAnyKeys(
    new Set([{ foo: 'bar' }, 'anotherKey'], [{ one: 'two' }, 'example'])
  );
});

doesNotHaveAllKeys ​

  • 類型: <T>(object: T, keys: Array<Object | string> | { [key: string]: any }, message?: string) => void

斷言 object 不具有所提供的至少一個 keys。您也可以提供單一物件而不是鍵陣列,其鍵將用作預期的鍵集。

ts
import { assert, test } from 'vitest';

test('assert.doesNotHaveAllKeys', () => {
  assert.doesNotHaveAllKeys({ foo: 1, bar: 2, baz: 3 }, [
    'one',
    'two',
    'example',
  ]);
  assert.doesNotHaveAllKeys(
    { foo: 1, bar: 2, baz: 3 },
    { one: 1, two: 2, example: 'foo' }
  );
  assert.doesNotHaveAllKeys(
    new Map([
      [{ foo: 1 }, 'bar'],
      ['key', 'value'],
    ]),
    [{ one: 'two' }, 'example']
  );
  assert.doesNotHaveAllKeys(new Set([{ foo: 'bar' }, 'anotherKey']), [
    { one: 'two' },
    'example',
  ]);
});

hasAnyDeepKeys ​

  • 類型: <T>(object: T, keys: Array<Object | string> | { [key: string]: any }, message?: string) => void

斷言 object 至少具有所提供的 keys 中的一個。由於 Set 和 Map 可以將物件作為鍵,因此您可以使用此斷言執行深度比較。您也可以提供單一物件而不是鍵陣列,其鍵將用作預期的鍵集。

ts
import { assert, test } from 'vitest';

test('assert.hasAnyDeepKeys', () => {
  assert.hasAnyDeepKeys(
    new Map([
      [{ one: 'one' }, 'valueOne'],
      [1, 2],
    ]),
    { one: 'one' }
  );
  assert.hasAnyDeepKeys(
    new Map([
      [{ one: 'one' }, 'valueOne'],
      [1, 2],
    ]),
    [{ one: 'one' }, { two: 'two' }]
  );
  assert.hasAnyDeepKeys(
    new Map([
      [{ one: 'one' }, 'valueOne'],
      [{ two: 'two' }, 'valueTwo'],
    ]),
    [{ one: 'one' }, { two: 'two' }]
  );
  assert.hasAnyDeepKeys(new Set([{ one: 'one' }, { two: 'two' }]), {
    one: 'one',
  });
  assert.hasAnyDeepKeys(new Set([{ one: 'one' }, { two: 'two' }]), [
    { one: 'one' },
    { three: 'three' },
  ]);
  assert.hasAnyDeepKeys(new Set([{ one: 'one' }, { two: 'two' }]), [
    { one: 'one' },
    { two: 'two' },
  ]);
});

hasAllDeepKeys ​

  • 類型: <T>(object: T, keys: Array<Object | string> | { [key: string]: any }, message?: string) => void

斷言 object 具有所提供的所有 keys,且僅有這些鍵。由於 Set 和 Map 可以將物件作為鍵,因此您可以使用此斷言執行深度比較。您也可以提供單一物件而不是鍵陣列,其鍵將用作預期的鍵集。

ts
import { assert, test } from 'vitest';

test('assert.hasAllDeepKeys', () => {
  assert.hasAllDeepKeys(new Map([[{ one: 'one' }, 'valueOne']]), {
    one: 'one',
  });
  assert.hasAllDeepKeys(
    new Map([
      [{ one: 'one' }, 'valueOne'],
      [{ two: 'two' }, 'valueTwo'],
    ]),
    [{ one: 'one' }, { two: 'two' }]
  );
  assert.hasAllDeepKeys(new Set([{ one: 'one' }]), { one: 'one' });
  assert.hasAllDeepKeys(new Set([{ one: 'one' }, { two: 'two' }]), [
    { one: 'one' },
    { two: 'two' },
  ]);
});

containsAllDeepKeys ​

  • 類型: <T>(object: T, keys: Array<Object | string> | { [key: string]: any }, message?: string) => void

斷言 object 包含所提供的所有 keys。由於 Set 和 Map 可以將物件作為鍵,因此您可以使用此斷言執行深度比較。您也可以提供單一物件而不是鍵陣列,其鍵將用作預期的鍵集。

ts
import { assert, test } from 'vitest';

test('assert.containsAllDeepKeys', () => {
  assert.containsAllDeepKeys(
    new Map([
      [{ one: 'one' }, 'valueOne'],
      [1, 2],
    ]),
    { one: 'one' }
  );
  assert.containsAllDeepKeys(
    new Map([
      [{ one: 'one' }, 'valueOne'],
      [{ two: 'two' }, 'valueTwo'],
    ]),
    [{ one: 'one' }, { two: 'two' }]
  );
  assert.containsAllDeepKeys(new Set([{ one: 'one' }, { two: 'two' }]), {
    one: 'one',
  });
  assert.containsAllDeepKeys(new Set([{ one: 'one' }, { two: 'two' }]), [
    { one: 'one' },
    { two: 'two' },
  ]);
});

doesNotHaveAnyDeepKeys ​

  • 類型: <T>(object: T, keys: Array<Object | string> | { [key: string]: any }, message?: string) => void

斷言 object 不具有所提供的任何 keys。由於 Set 和 Map 可以將物件作為鍵,因此您可以使用此斷言執行深度比較。您也可以提供單一物件而不是鍵陣列,其鍵將用作預期的鍵集。

ts
import { assert, test } from 'vitest';

test('assert.doesNotHaveAnyDeepKeys', () => {
  assert.doesNotHaveAnyDeepKeys(
    new Map([
      [{ one: 'one' }, 'valueOne'],
      [1, 2],
    ]),
    { thisDoesNot: 'exist' }
  );
  assert.doesNotHaveAnyDeepKeys(
    new Map([
      [{ one: 'one' }, 'valueOne'],
      [{ two: 'two' }, 'valueTwo'],
    ]),
    [{ twenty: 'twenty' }, { fifty: 'fifty' }]
  );
  assert.doesNotHaveAnyDeepKeys(new Set([{ one: 'one' }, { two: 'two' }]), {
    twenty: 'twenty',
  });
  assert.doesNotHaveAnyDeepKeys(new Set([{ one: 'one' }, { two: 'two' }]), [
    { twenty: 'twenty' },
    { fifty: 'fifty' },
  ]);
});

doesNotHaveAllDeepKeys ​

  • 類型: <T>(object: T, keys: Array<Object | string> | { [key: string]: any }, message?: string) => void

斷言 object 不具有所提供的至少一個 keys。由於 Set 和 Map 可以將物件作為鍵,因此您可以使用此斷言執行深度比較。您也可以提供單一物件而不是鍵陣列,其鍵將用作預期的鍵集。

ts
import { assert, test } from 'vitest';

test('assert.doesNotHaveAllDeepKeys', () => {
  assert.doesNotHaveAllDeepKeys(
    new Map([
      [{ one: 'one' }, 'valueOne'],
      [1, 2],
    ]),
    { thisDoesNot: 'exist' }
  );
  assert.doesNotHaveAllDeepKeys(
    new Map([
      [{ one: 'one' }, 'valueOne'],
      [{ two: 'two' }, 'valueTwo'],
    ]),
    [{ twenty: 'twenty' }, { one: 'one' }]
  );
  assert.doesNotHaveAllDeepKeys(new Set([{ one: 'one' }, { two: 'two' }]), {
    twenty: 'twenty',
  });
  assert.doesNotHaveAllDeepKeys(new Set([{ one: 'one' }, { two: 'two' }]), [
    { one: 'one' },
    { fifty: 'fifty' },
  ]);
});

throws ​

  • 類型:
    • (fn: () => void, errMsgMatcher?: RegExp | string, ignored?: any, message?: string) => void
    • (fn: () => void, errorLike?: ErrorConstructor | Error | null, errMsgMatcher?: RegExp | string | null, message?: string) => void
  • 別名:
    • throw
    • Throw

如果 errorLike 是一個 Error 構造函數,則斷言 fn 將拋出一個 errorLike 的實例錯誤。如果 errorLike 是一個 Error 實例,則斷言拋出的錯誤與 errorLike 是相同的實例。如果提供了 errMsgMatcher,它還會斷言拋出的錯誤將具有匹配 errMsgMatcher 的訊息。

ts
import { assert, test } from 'vitest';

test('assert.throws', () => {
  assert.throws(fn, '拋出的錯誤必須有此訊息');
  assert.throws(fn, /拋出的錯誤必須有匹配此訊息的訊息/);
  assert.throws(fn, ReferenceError);
  assert.throws(fn, errorInstance);
  assert.throws(
    fn,
    ReferenceError,
    '拋出的錯誤必須是 ReferenceError 並具有此訊息'
  );
  assert.throws(
    fn,
    errorInstance,
    '拋出的錯誤必須是相同的 errorInstance 並具有此訊息'
  );
  assert.throws(
    fn,
    ReferenceError,
    /拋出的錯誤必須是 ReferenceError 並匹配此訊息/
  );
  assert.throws(
    fn,
    errorInstance,
    /拋出的錯誤必須是相同的 errorInstance 並匹配此訊息/
  );
});

doesNotThrow ​

  • 類型: (fn: () => void, errMsgMatcher?: RegExp | string, ignored?: any, message?: string) => void
  • 類型: (fn: () => void, errorLike?: ErrorConstructor | Error | null, errMsgMatcher?: RegExp | string | null, message?: string) => void

如果 errorLike 是一個 Error 構造函數,則斷言 fn 不會拋出 errorLike 的實例錯誤。如果 errorLike 是一個 Error 實例,則斷言拋出的錯誤與 errorLike 不是相同的實例。如果提供了 errMsgMatcher,它還會斷言拋出的錯誤將不具有匹配 errMsgMatcher 的訊息。

ts
import { assert, test } from 'vitest';

test('assert.doesNotThrow', () => {
  assert.doesNotThrow(fn, '任何拋出的錯誤都不能有此訊息');
  assert.doesNotThrow(fn, /任何拋出的錯誤都不能匹配此訊息/);
  assert.doesNotThrow(fn, Error);
  assert.doesNotThrow(fn, errorInstance);
  assert.doesNotThrow(fn, Error, '錯誤不能有此訊息');
  assert.doesNotThrow(fn, errorInstance, '錯誤不能有此訊息');
  assert.doesNotThrow(fn, Error, /錯誤不能匹配此訊息/);
  assert.doesNotThrow(fn, errorInstance, /錯誤不能匹配此訊息/);
});

operator ​

  • 類型: (val1: OperatorComparable, operator: Operator, val2: OperatorComparable, message?: string) => void

使用 operator 比較 val1 和 val2。

ts
import { assert, test } from 'vitest';

test('assert.operator', () => {
  assert.operator(1, '<', 2, '一切正常');
});

closeTo ​

  • 類型: (actual: number, expected: number, delta: number, message?: string) => void
  • 別名: approximately

斷言 actual 等於 expected,在 +/- delta 範圍內。

ts
import { assert, test } from 'vitest';

test('assert.closeTo', () => {
  assert.closeTo(1.5, 1, 0.5, '數字接近');
});

sameMembers ​

  • 類型: <T>(set1: T[], set2: T[], message?: string) => void

斷言 set1 和 set2 具有相同的成員,順序不拘。使用嚴格相等檢查 (===)。

ts
import { assert, test } from 'vitest';

test('assert.sameMembers', () => {
  assert.sameMembers([1, 2, 3], [2, 1, 3], '相同成員');
});

notSameMembers ​

  • 類型: <T>(set1: T[], set2: T[], message?: string) => void

斷言 set1 和 set2 不具有相同的成員,順序不拘。使用嚴格相等檢查 (===)。

ts
import { assert, test } from 'vitest';

test('assert.notSameMembers', () => {
  assert.notSameMembers([1, 2, 3], [5, 1, 3], '成員不同');
});

sameDeepMembers ​

  • 類型: <T>(set1: T[], set2: T[], message?: string) => void

斷言 set1 和 set2 具有相同的成員,順序不拘。使用深度相等檢查。

ts
import { assert, test } from 'vitest';

test('assert.sameDeepMembers', () => {
  assert.sameDeepMembers(
    [{ a: 1 }, { b: 2 }, { c: 3 }],
    [{ b: 2 }, { a: 1 }, { c: 3 }],
    '相同深度成員'
  );
});

notSameDeepMembers ​

  • 類型: <T>(set1: T[], set2: T[], message?: string) => void

斷言 set1 和 set2 不具有相同的成員,順序不拘。使用深度相等檢查。

ts
import { assert, test } from 'vitest';

test('assert.notSameDeepMembers', () => {
  assert.notSameDeepMembers(
    [{ a: 1 }, { b: 2 }, { c: 3 }],
    [{ b: 2 }, { a: 1 }, { c: 3 }],
    '深度成員不同'
  );
});

sameOrderedMembers ​

  • 類型: <T>(set1: T[], set2: T[], message?: string) => void

斷言 set1 和 set2 具有相同順序的相同成員。使用嚴格相等檢查 (===)。

ts
import { assert, test } from 'vitest';

test('assert.sameOrderedMembers', () => {
  assert.sameOrderedMembers([1, 2, 3], [1, 2, 3], '相同順序成員');
});

notSameOrderedMembers ​

  • 類型: <T>(set1: T[], set2: T[], message?: string) => void

斷言 set1 和 set2 不具有相同順序的相同成員。使用嚴格相等檢查 (===)。

ts
import { assert, test } from 'vitest';

test('assert.notSameOrderedMembers', () => {
  assert.notSameOrderedMembers(
    [1, 2, 3],
    [2, 1, 3],
    '順序不同的成員'
  );
});

sameDeepOrderedMembers ​

  • 類型: <T>(set1: T[], set2: T[], message?: string) => void

斷言 set1 和 set2 具有相同順序的相同成員。使用深度相等檢查。

ts
import { assert, test } from 'vitest';

test('assert.sameDeepOrderedMembers', () => {
  assert.sameDeepOrderedMembers(
    [{ a: 1 }, { b: 2 }, { c: 3 }],
    [{ a: 1 }, { b: 2 }, { c: 3 }],
    '相同深度順序成員'
  );
});

notSameDeepOrderedMembers ​

  • 類型: <T>(set1: T[], set2: T[], message?: string) => void

斷言 set1 和 set2 不具有相同順序的相同成員。使用深度相等檢查。

ts
import { assert, test } from 'vitest';

test('assert.notSameDeepOrderedMembers', () => {
  assert.notSameDeepOrderedMembers(
    [{ a: 1 }, { b: 2 }, { c: 3 }],
    [{ a: 1 }, { b: 2 }, { z: 5 }],
    '深度順序不同的成員'
  );
  assert.notSameDeepOrderedMembers(
    [{ a: 1 }, { b: 2 }, { c: 3 }],
    [{ b: 2 }, { a: 1 }, { c: 3 }],
    '深度順序不同的成員'
  );
});

includeMembers ​

  • 類型: <T>(superset: T[], subset: T[], message?: string) => void

斷言 subset 包含在 superset 中,順序不拘。使用嚴格相等檢查 (===)。重複項將被忽略。

ts
import { assert, test } from 'vitest';

test('assert.includeMembers', () => {
  assert.includeMembers([1, 2, 3], [2, 1, 2], '包含成員');
});

notIncludeMembers ​

  • 類型: <T>(superset: T[], subset: T[], message?: string) => void

斷言 subset 不包含在 superset 中,順序不拘。使用嚴格相等檢查 (===)。重複項將被忽略。

ts
import { assert, test } from 'vitest';

test('assert.notIncludeMembers', () => {
  assert.notIncludeMembers([1, 2, 3], [5, 1], '不包含成員');
});

includeDeepMembers ​

  • 類型: <T>(superset: T[], subset: T[], message?: string) => void

斷言 subset 包含在 superset 中,順序不拘。使用深度相等檢查。重複項將被忽略。

ts
import { assert, test } from 'vitest';

test('assert.includeDeepMembers', () => {
  assert.includeDeepMembers(
    [{ a: 1 }, { b: 2 }, { c: 3 }],
    [{ b: 2 }, { a: 1 }, { b: 2 }],
    '包含深度成員'
  );
});

notIncludeDeepMembers ​

  • 類型: <T>(superset: T[], subset: T[], message?: string) => void

斷言 subset 不包含在 superset 中,順序不拘。使用深度相等檢查。重複項將被忽略。

ts
import { assert, test } from 'vitest';

test('assert.notIncludeDeepMembers', () => {
  assert.notIncludeDeepMembers(
    [{ a: 1 }, { b: 2 }, { c: 3 }],
    [{ b: 2 }, { f: 5 }],
    '不包含深度成員'
  );
});

includeOrderedMembers ​

  • 類型: <T>(superset: T[], subset: T[], message?: string) => void

斷言 subset 包含在 superset 中,且順序與 superset 的第一個元素開始的順序相同。使用嚴格相等檢查 (===)。

ts
import { assert, test } from 'vitest';

test('assert.includeOrderedMembers', () => {
  assert.includeOrderedMembers([1, 2, 3], [1, 2], '包含有序成員');
});

notIncludeOrderedMembers ​

  • 類型: <T>(superset: T[], subset: T[], message?: string) => void

斷言 subset 不包含在 superset 中,且順序與 superset 的第一個元素開始的順序相同。使用嚴格相等檢查 (===)。

ts
import { assert, test } from 'vitest';

test('assert.notIncludeOrderedMembers', () => {
  assert.notIncludeOrderedMembers(
    [1, 2, 3],
    [2, 1],
    '不包含有序成員'
  );
  assert.notIncludeOrderedMembers(
    [1, 2, 3],
    [2, 3],
    '不包含有序成員'
  );
});

includeDeepOrderedMembers ​

  • 類型: <T>(superset: T[], subset: T[], message?: string) => void

斷言 subset 包含在 superset 中,且順序與 superset 的第一個元素開始的順序相同。使用深度相等檢查。

ts
import { assert, test } from 'vitest';

test('assert.includeDeepOrderedMembers', () => {
  assert.includeDeepOrderedMembers(
    [{ a: 1 }, { b: 2 }, { c: 3 }],
    [{ a: 1 }, { b: 2 }],
    '包含深度有序成員'
  );
});

notIncludeDeepOrderedMembers ​

  • 類型: <T>(superset: T[], subset: T[], message?: string) => void

斷言 subset 不包含在 superset 中,且順序與 superset 的第一個元素開始的順序相同。使用深度相等檢查。

ts
import { assert, test } from 'vitest';

test('assert.notIncludeDeepOrderedMembers', () => {
  assert.notIncludeDeepOrderedMembers(
    [{ a: 1 }, { b: 2 }, { c: 3 }],
    [{ a: 1 }, { f: 5 }],
    '不包含深度有序成員'
  );
  assert.notIncludeDeepOrderedMembers(
    [{ a: 1 }, { b: 2 }, { c: 3 }],
    [{ b: 2 }, { a: 1 }],
    '不包含深度有序成員'
  );
  assert.notIncludeDeepOrderedMembers(
    [{ a: 1 }, { b: 2 }, { c: 3 }],
    [{ b: 2 }, { c: 3 }],
    '不包含深度有序成員'
  );
});

oneOf ​

  • 類型: <T>(inList: T, list: T[], message?: string) => void

斷言非物件、非陣列值 inList 出現在平面陣列 list 中。

ts
import { assert, test } from 'vitest';

test('assert.oneOf', () => {
  assert.oneOf(1, [2, 1], '未在列表中找到');
});

changes ​

  • 類型: <T>(modifier: Function, object: T, property: string, message?: string) => void

斷言 modifier 更改了 object 的 property 值。

ts
import { assert, test } from 'vitest';

test('assert.changes', () => {
  const obj = { val: 10 };
  function fn() {
    obj.val = 22;
  }
  assert.changes(fn, obj, 'val');
});

changesBy ​

  • 類型: <T>(modifier: Function, object: T, property: string, change: number, message?: string) => void

斷言 modifier 將 object 的 property 值更改了 change。

ts
import { assert, test } from 'vitest';

test('assert.changesBy', () => {
  const obj = { val: 10 };
  function fn() {
    obj.val += 2;
  }
  assert.changesBy(fn, obj, 'val', 2);
});

doesNotChange ​

  • 類型: <T>(modifier: Function, object: T, property: string, message?: string) => void

斷言 modifier 沒有更改 object 的 property 值。

ts
import { assert, test } from 'vitest';

test('assert.doesNotChange', () => {
  const obj = { val: 10 };
  function fn() {
    obj.val += 2;
  }
  assert.doesNotChange(fn, obj, 'val', 2);
});

changesButNotBy ​

  • 類型: <T>(modifier: Function, object: T, property: string, change:number, message?: string) => void

斷言 modifier 沒有將 object 的 property 值或 modifier 的回傳值更改 change。

ts
import { assert, test } from 'vitest';

test('assert.changesButNotBy', () => {
  const obj = { val: 10 };
  function fn() {
    obj.val += 10;
  }
  assert.changesButNotBy(fn, obj, 'val', 5);
});

increases ​

  • 類型: <T>(modifier: Function, object: T, property: string, message?: string) => void

斷言 modifier 增加了數字 object 的 property 值。

ts
import { assert, test } from 'vitest';

test('assert.increases', () => {
  const obj = { val: 10 };
  function fn() {
    obj.val = 13;
  }
  assert.increases(fn, obj, 'val');
});

increasesBy ​

  • 類型: <T>(modifier: Function, object: T, property: string, change: number, message?: string) => void

斷言 modifier 將數字 object 的 property 值或 modifier 的回傳值增加了 change。

ts
import { assert, test } from 'vitest';

test('assert.increasesBy', () => {
  const obj = { val: 10 };
  function fn() {
    obj.val += 10;
  }
  assert.increasesBy(fn, obj, 'val', 10);
});

doesNotIncrease ​

  • 類型: <T>(modifier: Function, object: T, property: string, message?: string) => void

斷言 modifier 沒有增加數字 object 的 property 值。

ts
import { assert, test } from 'vitest';

test('assert.doesNotIncrease', () => {
  const obj = { val: 10 };
  function fn() {
    obj.val = 8;
  }
  assert.doesNotIncrease(fn, obj, 'val');
});

increasesButNotBy ​

  • 類型: <T>(modifier: Function, object: T, property: string, change: number, message?: string) => void

斷言 modifier 沒有將數字 object 的 property 值或 modifier 的回傳值增加 change。

ts
import { assert, test } from 'vitest';

test('assert.increasesButNotBy', () => {
  const obj = { val: 10 };
  function fn() {
    obj.val += 15;
  }
  assert.increasesButNotBy(fn, obj, 'val', 10);
});

decreases ​

  • 類型: <T>(modifier: Function, object: T, property: string, message?: string) => void

斷言 modifier 減少了數字 object 的 property 值。

ts
import { assert, test } from 'vitest';

test('assert.decreases', () => {
  const obj = { val: 10 };
  function fn() {
    obj.val = 5;
  }
  assert.decreases(fn, obj, 'val');
});

decreasesBy ​

  • 類型: <T>(modifier: Function, object: T, property: string, change: number, message?: string) => void

斷言 modifier 將數字 object 的 property 值或 modifier 的回傳值減少了 change。

ts
import { assert, test } from 'vitest';

test('assert.decreasesBy', () => {
  const obj = { val: 10 };
  function fn() {
    obj.val -= 5;
  }
  assert.decreasesBy(fn, obj, 'val', 5);
});

doesNotDecrease ​

  • 類型: <T>(modifier: Function, object: T, property: string, message?: string) => void

斷言 modifier 沒有減少數字 object 的 property 值。

ts
import { assert, test } from 'vitest';

test('assert.doesNotDecrease', () => {
  const obj = { val: 10 };
  function fn() {
    obj.val = 15;
  }
  assert.doesNotDecrease(fn, obj, 'val');
});

doesNotDecreaseBy ​

  • 類型: <T>(modifier: Function, object: T, property: string, change: number, message?: string) => void

斷言 modifier 沒有將數字 object 的 property 值或 modifier 的回傳值減少 change。

ts
import { assert, test } from 'vitest';

test('assert.doesNotDecreaseBy', () => {
  const obj = { val: 10 };
  function fn() {
    obj.val = 5;
  }
  assert.doesNotDecreaseBy(fn, obj, 'val', 1);
});

decreasesButNotBy ​

  • 類型: <T>(modifier: Function, object: T, property: string, change: number, message?: string) => void

斷言 modifier 沒有將數字 object 的 property 值或 modifier 的回傳值減少 change。

ts
import { assert, test } from 'vitest';

test('assert.decreasesButNotBy', () => {
  const obj = { val: 10 };
  function fn() {
    obj.val = 5;
  }
  assert.decreasesButNotBy(fn, obj, 'val', 1);
});

ifError ​

  • 類型: <T>(object: T, message?: string) => void

斷言 object 是否為假值;如果為真值,則拋出錯誤。此功能旨在讓 Chai 能夠作為 Node 的 assert 類別的直接替代品。

ts
import { assert, test } from 'vitest';

test('assert.ifError', () => {
  const err = new Error('我是一個自訂錯誤');
  assert.ifError(err); // 重新拋出錯誤!
});

isExtensible ​

  • 類型: <T>(object: T, message?: string) => void
  • 別名: extensible

斷言 object 是可擴展的(即可以添加新屬性)。

ts
import { assert, test } from 'vitest';

test('assert.isExtensible', () => {
  assert.isExtensible({});
});

isNotExtensible ​

  • 類型: <T>(object: T, message?: string) => void
  • 別名: notExtensible

斷言 object 是不可擴展的(即不能添加新屬性)。

ts
import { assert, test } from 'vitest';

test('assert.isNotExtensible', () => {
  const nonExtensibleObject = Object.preventExtensions({});
  const sealedObject = Object.seal({});
  const frozenObject = Object.freeze({});

  assert.isNotExtensible(nonExtensibleObject);
  assert.isNotExtensible(sealedObject);
  assert.isNotExtensible(frozenObject);
});

isSealed ​

  • 類型: <T>(object: T, message?: string) => void
  • 別名: sealed

斷言 object 是密封的(即不能添加新屬性,且現有屬性不能被移除)。

ts
import { assert, test } from 'vitest';

test('assert.isSealed', () => {
  const sealedObject = Object.seal({});
  const frozenObject = Object.freeze({});

  assert.isSealed(sealedObject);
  assert.isSealed(frozenObject);
});

isNotSealed ​

  • 類型: <T>(object: T, message?: string) => void
  • 別名: notSealed

斷言 object 是未密封的(即可以添加新屬性,且現有屬性可以被移除)。

ts
import { assert, test } from 'vitest';

test('assert.isNotSealed', () => {
  assert.isNotSealed({});
});

isFrozen ​

  • 類型: <T>(object: T, message?: string) => void
  • 別名: frozen

斷言 object 是凍結的(即不能添加新屬性,且現有屬性不能被修改)。

ts
import { assert, test } from 'vitest';

test('assert.isFrozen', () => {
  const frozenObject = Object.freeze({});
  assert.frozen(frozenObject);
});

isNotFrozen ​

  • 類型: <T>(object: T, message?: string) => void
  • 別名: notFrozen

斷言 object 是未凍結的(即可以添加新屬性,且現有屬性可以被修改)。

ts
import { assert, test } from 'vitest';

test('assert.isNotFrozen', () => {
  assert.isNotFrozen({});
});

isEmpty ​

  • 類型: <T>(target: T, message?: string) => void
  • 別名: empty

斷言 target 不包含任何值。對於陣列和字串,它會檢查 length 屬性。對於 Map 和 Set 實例,它會檢查 size 屬性。對於非函數物件,它會獲取其自身可列舉字串鍵的計數。

ts
import { assert, test } from 'vitest';

test('assert.isEmpty', () => {
  assert.isEmpty([]);
  assert.isEmpty('');
  assert.isEmpty(new Map());
  assert.isEmpty({});
});

isNotEmpty ​

  • 類型: <T>(object: T, message?: string) => void
  • 別名: notEmpty

斷言 target 包含值。對於陣列和字串,它會檢查 length 屬性。對於 Map 和 Set 實例,它會檢查 size 屬性。對於非函數物件,它會獲取其自身可列舉字串鍵的計數。

ts
import { assert, test } from 'vitest';

test('assert.isNotEmpty', () => {
  assert.isNotEmpty([1, 2]);
  assert.isNotEmpty('34');
  assert.isNotEmpty(new Set([5, 6]));
  assert.isNotEmpty({ key: 7 });
});
Pager
上一頁expectTypeOf
下一頁assertType

以 MIT 授權條款 發布。

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

https://vitest.dev/api/assert

以 MIT 授權條款 發布。

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