Node.js v26.0.0 文档
- Node.js v26.0.0
- 目录
- Assert
- 严格断言模式
- 遗留断言模式
- 类:
assert.AssertionError - 类:
assert.Assert assert(value[, message])assert.deepEqual(actual, expected[, message])assert.deepStrictEqual(actual, expected[, message])assert.doesNotMatch(string, regexp[, message])assert.doesNotReject(asyncFn[, error][, message])assert.doesNotThrow(fn[, error][, message])assert.equal(actual, expected[, message])assert.fail([message])assert.ifError(value)assert.match(string, regexp[, message])assert.notDeepEqual(actual, expected[, message])assert.notDeepStrictEqual(actual, expected[, message])assert.notEqual(actual, expected[, message])assert.notStrictEqual(actual, expected[, message])assert.ok(value[, message])assert.rejects(asyncFn[, error][, message])assert.strictEqual(actual, expected[, message])assert.throws(fn[, error][, message])assert.partialDeepStrictEqual(actual, expected[, message])
- Assert
- 索引
- 关于本文档
- 用法与示例
- 断言测试
- 异步上下文跟踪
- 异步钩子
- 缓冲区
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ 嵌入器 API
- 子进程
- 集群
- 命令行选项
- 控制台
- 加密
- 调试器
- 已弃用的 API
- 诊断通道
- DNS
- 域
- 环境变量
- 错误
- 事件
- 文件系统
- 全局对象
- HTTP
- HTTP/2
- HTTPS
- 检查器
- 国际化
- 模块:CommonJS 模块
- 模块:ECMAScript 模块
- 模块:
node:moduleAPI - 模块:包
- 模块:TypeScript
- 网络
- 可迭代流 API
- 操作系统
- 路径
- 性能钩子
- 权限
- 进程
- Punycode
- 查询字符串
- 逐行读取
- REPL
- 报告
- 单一可执行文件应用
- SQLite
- 流
- 字符串解码器
- 测试运行器
- 定时器
- TLS/SSL
- 跟踪事件
- TTY
- UDP/数据报
- URL
- 实用工具
- V8
- 虚拟机
- WASI
- Web Crypto API
- Web Streams API
- 工作线程
- Zlib
- Zlib 可迭代压缩
- 其他版本
- 选项
Assert#
稳定性:2 - 稳定
node:assert 模块提供了一组用于验证不变量的断言函数。
严格断言模式#
在严格断言模式下,非严格方法表现得与其对应的严格方法一致。例如,assert.deepEqual() 将表现得像 assert.deepStrictEqual()。
在严格断言模式下,对象的错误消息会显示差异。在遗留断言模式下,对象的错误消息会直接显示对象,通常会被截断。
Message 参数语义#
对于接受可选 message 参数的断言方法,消息可以以下列形式之一提供:
- string(字符串):按原样使用。如果在
message字符串后提供了额外的参数,它们将被视为类似于 printf 的替换(参见util.format())。 - Error(错误对象):如果将
Error实例作为message提供,则直接抛出该错误,而不是抛出AssertionError。 - function(函数):形式为
(actual, expected) => string的函数。仅在断言失败时调用,并应返回一个字符串用作错误消息。非字符串返回值将被忽略,转而使用默认消息。
如果在使用 Error 或函数作为 message 时传递了额外参数,调用将以 ERR_AMBIGUOUS_ARGUMENT 拒绝。
如果第一个参数既不是字符串、Error 也不是函数,将抛出 ERR_INVALID_ARG_TYPE。
使用严格断言模式
import { strict as assert } from 'node:assert';const assert = require('node:assert').strict;
import assert from 'node:assert/strict';const assert = require('node:assert/strict');
示例错误差异
import { strict as assert } from 'node:assert'; assert.deepEqual([[[1, 2, 3]], 4, 5], [[[1, 2, '3']], 4, 5]); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected ... Lines skipped // // [ // [ // ... // 2, // + 3 // - '3' // ], // ... // 5 // ]const assert = require('node:assert/strict'); assert.deepEqual([[[1, 2, 3]], 4, 5], [[[1, 2, '3']], 4, 5]); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected ... Lines skipped // // [ // [ // ... // 2, // + 3 // - '3' // ], // ... // 5 // ]
要停用颜色,请使用 NO_COLOR 或 NODE_DISABLE_COLORS 环境变量。这也将停用 REPL 中的颜色。有关终端环境中颜色支持的更多信息,请阅读 tty getColorDepth() 文档。
遗留断言模式#
遗留断言模式在以下方法中使用 == 运算符:
使用遗留断言模式
import assert from 'node:assert';const assert = require('node:assert');
遗留断言模式可能会产生令人惊讶的结果,特别是在使用 assert.deepEqual() 时。
// WARNING: This does not throw an AssertionError in legacy assertion mode!
assert.deepEqual(/a/gi, new Date());
类: assert.AssertionError#
- 继承自:
<errors.Error>
表示断言失败。由 node:assert 模块抛出的所有错误都将是 AssertionError 类的实例。
new assert.AssertionError(options)#
options<Object>
<Error> 的子类,表示断言失败。
所有实例都包含内置的 Error 属性(message 和 name)以及:
actual<any>设置为像assert.strictEqual()等方法的actual参数。expected<any>设置为像assert.strictEqual()等方法的expected值。generatedMessage<boolean>指示消息是否为自动生成 (true)。code<string>值始终为ERR_ASSERTION,表明该错误是断言错误。operator<string>设置为传入的运算符值。
import assert from 'node:assert'; // Generate an AssertionError to compare the error message later: const { message } = new assert.AssertionError({ actual: 1, expected: 2, operator: 'strictEqual', }); // Verify error output: try { assert.strictEqual(1, 2); } catch (err) { assert(err instanceof assert.AssertionError); assert.strictEqual(err.message, message); assert.strictEqual(err.name, 'AssertionError'); assert.strictEqual(err.actual, 1); assert.strictEqual(err.expected, 2); assert.strictEqual(err.code, 'ERR_ASSERTION'); assert.strictEqual(err.operator, 'strictEqual'); assert.strictEqual(err.generatedMessage, true); }const assert = require('node:assert'); // Generate an AssertionError to compare the error message later: const { message } = new assert.AssertionError({ actual: 1, expected: 2, operator: 'strictEqual', }); // Verify error output: try { assert.strictEqual(1, 2); } catch (err) { assert(err instanceof assert.AssertionError); assert.strictEqual(err.message, message); assert.strictEqual(err.name, 'AssertionError'); assert.strictEqual(err.actual, 1); assert.strictEqual(err.expected, 2); assert.strictEqual(err.code, 'ERR_ASSERTION'); assert.strictEqual(err.operator, 'strictEqual'); assert.strictEqual(err.generatedMessage, true); }
类: assert.Assert#
Assert 类允许创建具有自定义选项的独立断言实例。
new assert.Assert([options])#
options<Object>
创建一个新的断言实例。diff 选项控制断言错误消息中差异的详细程度。
const { Assert } = require('node:assert');
const assertInstance = new Assert({ diff: 'full' });
assertInstance.deepStrictEqual({ a: 1 }, { a: 2 });
// Shows a full diff in the error message.
重要提示:当从 Assert 实例解构断言方法时,这些方法会失去与实例配置选项(例如 diff、strict 和 skipPrototype 设置)的连接。解构后的方法将回退到默认行为。
const myAssert = new Assert({ diff: 'full' });
// This works as expected - uses 'full' diff
myAssert.strictEqual({ a: 1 }, { b: { c: 1 } });
// This loses the 'full' diff setting - falls back to default 'simple' diff
const { strictEqual } = myAssert;
strictEqual({ a: 1 }, { b: { c: 1 } });
skipPrototype 选项会影响所有深度相等性方法。
class Foo {
constructor(a) {
this.a = a;
}
}
class Bar {
constructor(a) {
this.a = a;
}
}
const foo = new Foo(1);
const bar = new Bar(1);
// Default behavior - fails due to different constructors
const assert1 = new Assert();
assert1.deepStrictEqual(foo, bar); // AssertionError
// Skip prototype comparison - passes if properties are equal
const assert2 = new Assert({ skipPrototype: true });
assert2.deepStrictEqual(foo, bar); // OK
解构后,方法会失去对实例 this 上下文的访问,并恢复为默认的断言行为(diff: 'simple', 非严格模式)。要在使用解构方法时保持自定义选项,请避免解构,直接在实例上调用方法。
assert(value[, message])#
value<any>检查其真值的输入。message<string>|<Error>|<Function>
assert.ok() 的别名。
assert.deepEqual(actual, expected[, message])#
actual<any>expected<any>message<string>|<Error>|<Function>
严格断言模式
遗留断言模式
稳定性: 3 - 遗留: 改用 assert.deepStrictEqual()。
测试 actual 和 expected 参数之间的深度相等性。考虑改用 assert.deepStrictEqual()。assert.deepEqual() 可能会产生令人惊讶的结果。
深度相等意味着子对象的可枚举“自有”属性也会按照以下规则递归计算。
比较详情#
- 原始值使用
==运算符进行比较,但<NaN>除外。如果双方都是<NaN>,则视为相同。 - 对象的 类型标签 应相同。
- 仅考虑 可枚举“自有”属性。
- 对象构造函数在可用时进行比较。
<Error>的名称、消息、原因和错误始终会进行比较,即使它们不是可枚举属性。- 对象包装器将同时作为对象和解包后的值进行比较。
Object属性以无序方式比较。<Map>键和<Set>项以无序方式比较。- 递归在双方不同或任一侧遇到循环引用时停止。
- 实现不会测试对象的
[[Prototype]]。 <Symbol>属性不会被比较。<WeakMap>、<WeakSet>和<Promise>实例不进行结构比较。它们仅在引用同一对象时相等。任何不同WeakMap、WeakSet或Promise实例之间的比较都将导致不等,即使它们包含相同的内容。<RegExp>的 lastIndex、flags 和 source 始终会进行比较,即使它们不是可枚举属性。
以下示例不会抛出 AssertionError,因为原始值是使用 == 运算符进行比较的。
import assert from 'node:assert'; // WARNING: This does not throw an AssertionError! assert.deepEqual('+00000000', false);const assert = require('node:assert'); // WARNING: This does not throw an AssertionError! assert.deepEqual('+00000000', false);
“深度”相等意味着子对象的可枚举“自有”属性也会被评估。
import assert from 'node:assert'; const obj1 = { a: { b: 1, }, }; const obj2 = { a: { b: 2, }, }; const obj3 = { a: { b: 1, }, }; const obj4 = { __proto__: obj1 }; assert.deepEqual(obj1, obj1); // OK // Values of b are different: assert.deepEqual(obj1, obj2); // AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } } assert.deepEqual(obj1, obj3); // OK // Prototypes are ignored: assert.deepEqual(obj1, obj4); // AssertionError: { a: { b: 1 } } deepEqual {}const assert = require('node:assert'); const obj1 = { a: { b: 1, }, }; const obj2 = { a: { b: 2, }, }; const obj3 = { a: { b: 1, }, }; const obj4 = { __proto__: obj1 }; assert.deepEqual(obj1, obj1); // OK // Values of b are different: assert.deepEqual(obj1, obj2); // AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } } assert.deepEqual(obj1, obj3); // OK // Prototypes are ignored: assert.deepEqual(obj1, obj4); // AssertionError: { a: { b: 1 } } deepEqual {}
如果值不相等,则会抛出 AssertionError,其 message 属性设置为 message 参数的值。如果 message 参数未定义,则分配默认错误消息。如果 message 参数是 <Error> 的实例,则会抛出该实例,而不是 AssertionError。
assert.deepStrictEqual(actual, expected[, message])#
actual<any>expected<any>message<string>|<Error>|<Function>
测试 actual 和 expected 参数之间的深度相等性。“深度”相等意味着子对象的可枚举“自有”属性也会按照以下规则递归计算。
比较详情#
- 原始值使用
Object.is()进行比较。 - 对象的 类型标签 应相同。
- 对象的
[[Prototype]]使用===运算符进行比较。 - 仅考虑 可枚举“自有”属性。
<Error>的名称、消息、原因和错误始终会进行比较,即使它们不是可枚举属性。errors属性也会进行比较。- 可枚举的自有
<Symbol>属性也会进行比较。 - 对象包装器将同时作为对象和解包后的值进行比较。
Object属性以无序方式比较。<Map>键和<Set>项以无序方式比较。- 递归在双方不同或任一侧遇到循环引用时停止。
<WeakMap>、<WeakSet>和<Promise>实例不进行结构比较。它们仅在引用同一对象时相等。任何不同WeakMap、WeakSet或Promise实例之间的比较都将导致不等,即使它们包含相同的内容。<RegExp>的 lastIndex、flags 和 source 始终会进行比较,即使它们不是可枚举属性。
import assert from 'node:assert/strict'; // This fails because 1 !== '1'. assert.deepStrictEqual({ a: 1 }, { a: '1' }); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // { // + a: 1 // - a: '1' // } // The following objects don't have own properties const date = new Date(); const object = {}; const fakeDate = {}; Object.setPrototypeOf(fakeDate, Date.prototype); // Different [[Prototype]]: assert.deepStrictEqual(object, fakeDate); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + {} // - Date {} // Different type tags: assert.deepStrictEqual(date, fakeDate); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + 2018-04-26T00:49:08.604Z // - Date {} assert.deepStrictEqual(NaN, NaN); // OK because Object.is(NaN, NaN) is true. // Different unwrapped numbers: assert.deepStrictEqual(new Number(1), new Number(2)); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + [Number: 1] // - [Number: 2] assert.deepStrictEqual(new String('foo'), Object('foo')); // OK because the object and the string are identical when unwrapped. assert.deepStrictEqual(-0, -0); // OK // Different zeros: assert.deepStrictEqual(0, -0); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + 0 // - -0 const symbol1 = Symbol(); const symbol2 = Symbol(); assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol1]: 1 }); // OK, because it is the same symbol on both objects. assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol2]: 1 }); // AssertionError [ERR_ASSERTION]: Inputs identical but not reference equal: // // { // Symbol(): 1 // } const weakMap1 = new WeakMap(); const weakMap2 = new WeakMap(); const obj = {}; weakMap1.set(obj, 'value'); weakMap2.set(obj, 'value'); // Comparing different instances fails, even with same contents assert.deepStrictEqual(weakMap1, weakMap2); // AssertionError: Values have same structure but are not reference-equal: // // WeakMap { // <items unknown> // } // Comparing the same instance to itself succeeds assert.deepStrictEqual(weakMap1, weakMap1); // OK const weakSet1 = new WeakSet(); const weakSet2 = new WeakSet(); weakSet1.add(obj); weakSet2.add(obj); // Comparing different instances fails, even with same contents assert.deepStrictEqual(weakSet1, weakSet2); // AssertionError: Values have same structure but are not reference-equal: // + actual - expected // // WeakSet { // <items unknown> // } // Comparing the same instance to itself succeeds assert.deepStrictEqual(weakSet1, weakSet1); // OKconst assert = require('node:assert/strict'); // This fails because 1 !== '1'. assert.deepStrictEqual({ a: 1 }, { a: '1' }); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // { // + a: 1 // - a: '1' // } // The following objects don't have own properties const date = new Date(); const object = {}; const fakeDate = {}; Object.setPrototypeOf(fakeDate, Date.prototype); // Different [[Prototype]]: assert.deepStrictEqual(object, fakeDate); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + {} // - Date {} // Different type tags: assert.deepStrictEqual(date, fakeDate); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + 2018-04-26T00:49:08.604Z // - Date {} assert.deepStrictEqual(NaN, NaN); // OK because Object.is(NaN, NaN) is true. // Different unwrapped numbers: assert.deepStrictEqual(new Number(1), new Number(2)); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + [Number: 1] // - [Number: 2] assert.deepStrictEqual(new String('foo'), Object('foo')); // OK because the object and the string are identical when unwrapped. assert.deepStrictEqual(-0, -0); // OK // Different zeros: assert.deepStrictEqual(0, -0); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + 0 // - -0 const symbol1 = Symbol(); const symbol2 = Symbol(); assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol1]: 1 }); // OK, because it is the same symbol on both objects. assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol2]: 1 }); // AssertionError [ERR_ASSERTION]: Inputs identical but not reference equal: // // { // Symbol(): 1 // } const weakMap1 = new WeakMap(); const weakMap2 = new WeakMap(); const obj = {}; weakMap1.set(obj, 'value'); weakMap2.set(obj, 'value'); // Comparing different instances fails, even with same contents assert.deepStrictEqual(weakMap1, weakMap2); // AssertionError: Values have same structure but are not reference-equal: // // WeakMap { // <items unknown> // } // Comparing the same instance to itself succeeds assert.deepStrictEqual(weakMap1, weakMap1); // OK const weakSet1 = new WeakSet(); const weakSet2 = new WeakSet(); weakSet1.add(obj); weakSet2.add(obj); // Comparing different instances fails, even with same contents assert.deepStrictEqual(weakSet1, weakSet2); // AssertionError: Values have same structure but are not reference-equal: // + actual - expected // // WeakSet { // <items unknown> // } // Comparing the same instance to itself succeeds assert.deepStrictEqual(weakSet1, weakSet1); // OK
如果值不相等,则会抛出 AssertionError,其 message 属性设置为 message 参数的值。如果 message 参数未定义,则分配默认错误消息。如果 message 参数是 <Error> 的实例,则会抛出该实例,而不是 AssertionError。
assert.doesNotMatch(string, regexp[, message])#
string<string>regexp<RegExp>message<string>|<Error>|<Function>
期望 string 输入不匹配正则表达式。
import assert from 'node:assert/strict'; assert.doesNotMatch('I will fail', /fail/); // AssertionError [ERR_ASSERTION]: The input was expected to not match the ... assert.doesNotMatch(123, /pass/); // AssertionError [ERR_ASSERTION]: The "string" argument must be of type string. assert.doesNotMatch('I will pass', /different/); // OKconst assert = require('node:assert/strict'); assert.doesNotMatch('I will fail', /fail/); // AssertionError [ERR_ASSERTION]: The input was expected to not match the ... assert.doesNotMatch(123, /pass/); // AssertionError [ERR_ASSERTION]: The "string" argument must be of type string. assert.doesNotMatch('I will pass', /different/); // OK
如果值确实匹配,或者 string 参数的类型不是字符串,则会抛出 AssertionError,其 message 属性设置为 message 参数的值。如果 message 参数未定义,则分配默认错误消息。如果 message 参数是 <Error> 的实例,则会抛出该实例,而不是 AssertionError。
assert.doesNotReject(asyncFn[, error][, message])#
asyncFn<Function>|<Promise>error<RegExp>|<Function>message<string>- 返回:
<Promise>
等待 asyncFn promise,或者如果 asyncFn 是一个函数,则立即调用该函数并等待返回的 promise 完成。然后它将检查该 promise 是否未被拒绝。
如果 asyncFn 是一个函数并且它同步抛出错误,assert.doesNotReject() 将返回一个带有该错误的被拒绝的 Promise。如果该函数没有返回 promise,assert.doesNotReject() 将返回一个带有 ERR_INVALID_RETURN_VALUE 错误的被拒绝的 Promise。在这两种情况下,错误处理器都会被跳过。
使用 assert.doesNotReject() 实际上没有意义,因为捕获拒绝后再将其拒绝几乎没有好处。相反,考虑在不应拒绝的特定代码路径旁边添加注释,并使错误消息尽可能具有表现力。
如果指定,error 可以是 Class、<RegExp> 或验证函数。详见 assert.throws()。
除了等待完成的异步性质外,其行为与 assert.doesNotThrow() 相同。
import assert from 'node:assert/strict'; await assert.doesNotReject( async () => { throw new TypeError('Wrong value'); }, SyntaxError, );const assert = require('node:assert/strict'); (async () => { await assert.doesNotReject( async () => { throw new TypeError('Wrong value'); }, SyntaxError, ); })();
import assert from 'node:assert/strict'; assert.doesNotReject(Promise.reject(new TypeError('Wrong value'))) .then(() => { // ... });const assert = require('node:assert/strict'); assert.doesNotReject(Promise.reject(new TypeError('Wrong value'))) .then(() => { // ... });
assert.doesNotThrow(fn[, error][, message])#
fn<Function>error<RegExp>|<Function>message<string>
断言函数 fn 不会抛出错误。
使用 assert.doesNotThrow() 实际上没有意义,因为捕获错误后再重新抛出它没有好处。相反,考虑在不应抛出的特定代码路径旁边添加注释,并使错误消息尽可能具有表现力。
当调用 assert.doesNotThrow() 时,它将立即调用 fn 函数。
如果抛出了错误并且它与 error 参数指定的类型相同,则会抛出 AssertionError。如果错误类型不同,或者 error 参数未定义,则错误将传播回调用者。
如果指定,error 可以是 Class、<RegExp> 或验证函数。详见 assert.throws()。
例如,以下代码将抛出 <TypeError>,因为断言中没有匹配的错误类型:
import assert from 'node:assert/strict'; assert.doesNotThrow( () => { throw new TypeError('Wrong value'); }, SyntaxError, );const assert = require('node:assert/strict'); assert.doesNotThrow( () => { throw new TypeError('Wrong value'); }, SyntaxError, );
然而,以下代码将导致一个带有消息 'Got unwanted exception...' 的 AssertionError:
import assert from 'node:assert/strict'; assert.doesNotThrow( () => { throw new TypeError('Wrong value'); }, TypeError, );const assert = require('node:assert/strict'); assert.doesNotThrow( () => { throw new TypeError('Wrong value'); }, TypeError, );
如果抛出了 AssertionError 并且为 message 参数提供了值,则 message 的值将附加到 AssertionError 消息中。
import assert from 'node:assert/strict'; assert.doesNotThrow( () => { throw new TypeError('Wrong value'); }, /Wrong value/, 'Whoops', ); // Throws: AssertionError: Got unwanted exception: Whoopsconst assert = require('node:assert/strict'); assert.doesNotThrow( () => { throw new TypeError('Wrong value'); }, /Wrong value/, 'Whoops', ); // Throws: AssertionError: Got unwanted exception: Whoops
assert.equal(actual, expected[, message])#
actual<any>expected<any>message<string>|<Error>|<Function>
严格断言模式
assert.strictEqual() 的别名。
遗留断言模式
稳定性: 3 - 遗留: 改用 assert.strictEqual()。
使用 == 运算符测试 actual 和 expected 参数之间的浅层、强制相等性。NaN 会经过特殊处理,如果双方都是 NaN,则视为相同。
import assert from 'node:assert'; assert.equal(1, 1); // OK, 1 == 1 assert.equal(1, '1'); // OK, 1 == '1' assert.equal(NaN, NaN); // OK assert.equal(1, 2); // AssertionError: 1 == 2 assert.equal({ a: { b: 1 } }, { a: { b: 1 } }); // AssertionError: { a: { b: 1 } } == { a: { b: 1 } }const assert = require('node:assert'); assert.equal(1, 1); // OK, 1 == 1 assert.equal(1, '1'); // OK, 1 == '1' assert.equal(NaN, NaN); // OK assert.equal(1, 2); // AssertionError: 1 == 2 assert.equal({ a: { b: 1 } }, { a: { b: 1 } }); // AssertionError: { a: { b: 1 } } == { a: { b: 1 } }
如果值不相等,则会抛出 AssertionError,其 message 属性设置为 message 参数的值。如果 message 参数未定义,则分配默认错误消息。如果 message 参数是 <Error> 的实例,则会抛出该实例,而不是 AssertionError。
assert.fail([message])#
抛出一个带有提供的错误消息或默认错误消息的 AssertionError。如果 message 参数是 <Error> 的实例,则会抛出该实例,而不是 AssertionError。
import assert from 'node:assert/strict'; assert.fail(); // AssertionError [ERR_ASSERTION]: Failed assert.fail('boom'); // AssertionError [ERR_ASSERTION]: boom assert.fail(new TypeError('need array')); // TypeError: need arrayconst assert = require('node:assert/strict'); assert.fail(); // AssertionError [ERR_ASSERTION]: Failed assert.fail('boom'); // AssertionError [ERR_ASSERTION]: boom assert.fail(new TypeError('need array')); // TypeError: need array
assert.ifError(value)#
value<any>
如果 value 不是 undefined 或 null,则抛出 value。这在测试回调中的 error 参数时非常有用。堆栈跟踪包含从传递给 ifError() 的错误中提取的所有帧,包括 ifError() 本身可能产生的新帧。
import assert from 'node:assert/strict'; assert.ifError(null); // OK assert.ifError(0); // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: 0 assert.ifError('error'); // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: 'error' assert.ifError(new Error()); // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: Error // Create some random error frames. let err; (function errorFrame() { err = new Error('test error'); })(); (function ifErrorFrame() { assert.ifError(err); })(); // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: test error // at ifErrorFrame // at errorFrameconst assert = require('node:assert/strict'); assert.ifError(null); // OK assert.ifError(0); // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: 0 assert.ifError('error'); // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: 'error' assert.ifError(new Error()); // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: Error // Create some random error frames. let err; (function errorFrame() { err = new Error('test error'); })(); (function ifErrorFrame() { assert.ifError(err); })(); // AssertionError [ERR_ASSERTION]: ifError got unwanted exception: test error // at ifErrorFrame // at errorFrame
assert.match(string, regexp[, message])#
string<string>regexp<RegExp>message<string>|<Error>|<Function>
期望 string 输入匹配正则表达式。
import assert from 'node:assert/strict'; assert.match('I will fail', /pass/); // AssertionError [ERR_ASSERTION]: The input did not match the regular ... assert.match(123, /pass/); // AssertionError [ERR_ASSERTION]: The "string" argument must be of type string. assert.match('I will pass', /pass/); // OKconst assert = require('node:assert/strict'); assert.match('I will fail', /pass/); // AssertionError [ERR_ASSERTION]: The input did not match the regular ... assert.match(123, /pass/); // AssertionError [ERR_ASSERTION]: The "string" argument must be of type string. assert.match('I will pass', /pass/); // OK
如果值不匹配,或者 string 参数的类型不是字符串,则会抛出 AssertionError,其 message 属性设置为 message 参数的值。如果 message 参数未定义,则分配默认错误消息。如果 message 参数是 <Error> 的实例,则会抛出该实例,而不是 AssertionError。
assert.notDeepEqual(actual, expected[, message])#
actual<any>expected<any>message<string>|<Error>|<Function>
严格断言模式
assert.notDeepStrictEqual() 的别名。
遗留断言模式
稳定性: 3 - 遗留: 改用 assert.notDeepStrictEqual()。
测试任何深度不等性。assert.deepEqual() 的反面。
import assert from 'node:assert'; const obj1 = { a: { b: 1, }, }; const obj2 = { a: { b: 2, }, }; const obj3 = { a: { b: 1, }, }; const obj4 = { __proto__: obj1 }; assert.notDeepEqual(obj1, obj1); // AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } } assert.notDeepEqual(obj1, obj2); // OK assert.notDeepEqual(obj1, obj3); // AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } } assert.notDeepEqual(obj1, obj4); // OKconst assert = require('node:assert'); const obj1 = { a: { b: 1, }, }; const obj2 = { a: { b: 2, }, }; const obj3 = { a: { b: 1, }, }; const obj4 = { __proto__: obj1 }; assert.notDeepEqual(obj1, obj1); // AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } } assert.notDeepEqual(obj1, obj2); // OK assert.notDeepEqual(obj1, obj3); // AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } } assert.notDeepEqual(obj1, obj4); // OK
如果值深度相等,则会抛出 AssertionError,其 message 属性设置为 message 参数的值。如果 message 参数未定义,则分配默认错误消息。如果 message 参数是 <Error> 的实例,则会抛出该实例,而不是 AssertionError。
assert.notDeepStrictEqual(actual, expected[, message])#
actual<any>expected<any>message<string>|<Error>|<Function>
测试深度严格不等性。assert.deepStrictEqual() 的反面。
import assert from 'node:assert/strict'; assert.notDeepStrictEqual({ a: 1 }, { a: '1' }); // OKconst assert = require('node:assert/strict'); assert.notDeepStrictEqual({ a: 1 }, { a: '1' }); // OK
如果值深度且严格相等,则会抛出 AssertionError,其 message 属性设置为 message 参数的值。如果 message 参数未定义,则分配默认错误消息。如果 message 参数是 <Error> 的实例,则会抛出该实例,而不是 AssertionError。
assert.notEqual(actual, expected[, message])#
actual<any>expected<any>message<string>|<Error>|<Function>
严格断言模式
遗留断言模式
稳定性: 3 - 遗留: 改用 assert.notStrictEqual()。
使用 != 运算符测试浅层、强制不等性。NaN 会经过特殊处理,如果双方都是 NaN,则视为相同。
import assert from 'node:assert'; assert.notEqual(1, 2); // OK assert.notEqual(1, 1); // AssertionError: 1 != 1 assert.notEqual(1, '1'); // AssertionError: 1 != '1'const assert = require('node:assert'); assert.notEqual(1, 2); // OK assert.notEqual(1, 1); // AssertionError: 1 != 1 assert.notEqual(1, '1'); // AssertionError: 1 != '1'
如果值相等,则会抛出 AssertionError,其 message 属性设置为 message 参数的值。如果 message 参数未定义,则分配默认错误消息。如果 message 参数是 <Error> 的实例,则会抛出该实例,而不是 AssertionError。
assert.notStrictEqual(actual, expected[, message])#
actual<any>expected<any>message<string>|<Error>|<Function>
由 Object.is() 确定 actual 和 expected 参数之间的严格不等性。
import assert from 'node:assert/strict'; assert.notStrictEqual(1, 2); // OK assert.notStrictEqual(1, 1); // AssertionError [ERR_ASSERTION]: Expected "actual" to be strictly unequal to: // // 1 assert.notStrictEqual(1, '1'); // OKconst assert = require('node:assert/strict'); assert.notStrictEqual(1, 2); // OK assert.notStrictEqual(1, 1); // AssertionError [ERR_ASSERTION]: Expected "actual" to be strictly unequal to: // // 1 assert.notStrictEqual(1, '1'); // OK
如果值严格相等,则会抛出 AssertionError,其 message 属性设置为 message 参数的值。如果 message 参数未定义,则分配默认错误消息。如果 message 参数是 <Error> 的实例,则会抛出该实例,而不是 AssertionError。
assert.ok(value[, message])#
value<any>message<string>|<Error>|<Function>
测试 value 是否为真值。它等同于 assert.equal(!!value, true, message)。
如果 value 不是真值,则会抛出 AssertionError,其 message 属性设置为 message 参数的值。如果 message 参数为 undefined,则分配默认错误消息。如果 message 参数是 <Error> 的实例,则会抛出该实例,而不是 AssertionError。如果不传递任何参数,message 将被设置为字符串:'No value argument passed to `assert.ok()`'。
请注意,在 repl 中,错误消息将与在文件中抛出的消息不同!有关详细信息,请参阅下文。
import assert from 'node:assert/strict'; assert.ok(true); // OK assert.ok(1); // OK assert.ok(); // AssertionError: No value argument passed to `assert.ok()` assert.ok(false, 'it\'s false'); // AssertionError: it's false // In the repl: assert.ok(typeof 123 === 'string'); // AssertionError: false == true // In a file (e.g. test.js): assert.ok(typeof 123 === 'string'); // AssertionError: The expression evaluated to a falsy value: // // assert.ok(typeof 123 === 'string') assert.ok(false); // AssertionError: The expression evaluated to a falsy value: // // assert.ok(false) assert.ok(0); // AssertionError: The expression evaluated to a falsy value: // // assert.ok(0)const assert = require('node:assert/strict'); assert.ok(true); // OK assert.ok(1); // OK assert.ok(); // AssertionError: No value argument passed to `assert.ok()` assert.ok(false, 'it\'s false'); // AssertionError: it's false // In the repl: assert.ok(typeof 123 === 'string'); // AssertionError: false == true // In a file (e.g. test.js): assert.ok(typeof 123 === 'string'); // AssertionError: The expression evaluated to a falsy value: // // assert.ok(typeof 123 === 'string') assert.ok(false); // AssertionError: The expression evaluated to a falsy value: // // assert.ok(false) assert.ok(0); // AssertionError: The expression evaluated to a falsy value: // // assert.ok(0)
import assert from 'node:assert/strict'; // Using `assert()` works the same: assert(2 + 2 > 5); // AssertionError: The expression evaluated to a falsy value: // // assert(2 + 2 > 5)const assert = require('node:assert'); // Using `assert()` works the same: assert(2 + 2 > 5); // AssertionError: The expression evaluated to a falsy value: // // assert(2 + 2 > 5)
assert.rejects(asyncFn[, error][, message])#
asyncFn<Function>|<Promise>error<RegExp>|<Function>|<Object>|<Error>message<string>- 返回:
<Promise>
等待 asyncFn promise,或者如果 asyncFn 是一个函数,则立即调用该函数并等待返回的 promise 完成。然后它将检查该 promise 是否被拒绝。
如果 asyncFn 是一个函数并且它同步抛出错误,assert.rejects() 将返回一个带有该错误的被拒绝的 Promise。如果该函数没有返回 promise,assert.rejects() 将返回一个带有 ERR_INVALID_RETURN_VALUE 错误的被拒绝的 Promise。在这两种情况下,错误处理器都会被跳过。
除了等待完成的异步性质外,其行为与 assert.throws() 相同。
如果指定,error 可以是 Class、<RegExp>、验证函数、每个属性都将被测试的对象,或错误实例(包括其不可枚举的 message 和 name 属性)。
如果指定,message 将是当 asyncFn 未能拒绝时 AssertionError 提供的消息。
import assert from 'node:assert/strict'; await assert.rejects( async () => { throw new TypeError('Wrong value'); }, { name: 'TypeError', message: 'Wrong value', }, );const assert = require('node:assert/strict'); (async () => { await assert.rejects( async () => { throw new TypeError('Wrong value'); }, { name: 'TypeError', message: 'Wrong value', }, ); })();
import assert from 'node:assert/strict'; await assert.rejects( async () => { throw new TypeError('Wrong value'); }, (err) => { assert.strictEqual(err.name, 'TypeError'); assert.strictEqual(err.message, 'Wrong value'); return true; }, );const assert = require('node:assert/strict'); (async () => { await assert.rejects( async () => { throw new TypeError('Wrong value'); }, (err) => { assert.strictEqual(err.name, 'TypeError'); assert.strictEqual(err.message, 'Wrong value'); return true; }, ); })();
import assert from 'node:assert/strict'; assert.rejects( Promise.reject(new Error('Wrong value')), Error, ).then(() => { // ... });const assert = require('node:assert/strict'); assert.rejects( Promise.reject(new Error('Wrong value')), Error, ).then(() => { // ... });
error 不能是字符串。如果第二个参数提供了字符串,则认为 error 被省略,字符串将用作 message。这容易导致忽视错误。如果考虑使用字符串作为第二个参数,请仔细阅读 assert.throws() 中的示例。
assert.strictEqual(actual, expected[, message])#
actual<any>expected<any>message<string>|<Error>|<Function>如果用作格式化字符串,则后缀为类似于printf的参数。如果 message 是一个函数,它将在比较失败时被调用。该函数接收actual和expected参数,并必须返回一个将用作错误消息的字符串。printf风格的格式字符串和函数在传递参数时出于性能原因非常有益。此外,它们可以轻松实现精美的格式化。
由 Object.is() 确定 actual 和 expected 参数之间的严格相等性。
import assert from 'node:assert/strict'; assert.strictEqual(1, 2); // AssertionError [ERR_ASSERTION]: Expected inputs to be strictly equal: // // 1 !== 2 assert.strictEqual(1, 1); // OK assert.strictEqual('Hello foobar', 'Hello World!'); // AssertionError [ERR_ASSERTION]: Expected inputs to be strictly equal: // + actual - expected // // + 'Hello foobar' // - 'Hello World!' // ^ const apples = 1; const oranges = 2; assert.strictEqual(apples, oranges, `apples ${apples} !== oranges ${oranges}`); // AssertionError [ERR_ASSERTION]: apples 1 !== oranges 2 assert.strictEqual(apples, oranges, 'apples %s !== oranges %s', apples, oranges); // AssertionError [ERR_ASSERTION]: apples 1 !== oranges 2 assert.strictEqual(1, '1', new TypeError('Inputs are not identical')); // TypeError: Inputs are not identical assert.strictEqual(apples, oranges, (actual, expected) => { // Do 'heavy' computations return `I expected ${expected} but I got ${actual}`; }); // AssertionError [ERR_ASSERTION]: I expected oranges but I got applesconst assert = require('node:assert/strict'); assert.strictEqual(1, 2); // AssertionError [ERR_ASSERTION]: Expected inputs to be strictly equal: // // 1 !== 2 assert.strictEqual(1, 1); // OK assert.strictEqual('Hello foobar', 'Hello World!'); // AssertionError [ERR_ASSERTION]: Expected inputs to be strictly equal: // + actual - expected // // + 'Hello foobar' // - 'Hello World!' // ^ const apples = 1; const oranges = 2; assert.strictEqual(apples, oranges, `apples ${apples} !== oranges ${oranges}`); // AssertionError [ERR_ASSERTION]: apples 1 !== oranges 2 assert.strictEqual(apples, oranges, 'apples %s !== oranges %s', apples, oranges); // AssertionError [ERR_ASSERTION]: apples 1 !== oranges 2 assert.strictEqual(1, '1', new TypeError('Inputs are not identical')); // TypeError: Inputs are not identical assert.strictEqual(apples, oranges, (actual, expected) => { // Do 'heavy' computations return `I expected ${expected} but I got ${actual}`; }); // AssertionError [ERR_ASSERTION]: I expected oranges but I got apples
如果值不严格相等,则会抛出 AssertionError,其 message 属性设置为 message 参数的值。如果 message 参数未定义,则分配默认错误消息。如果 message 参数是 <Error> 的实例,则会抛出该实例,而不是 AssertionError。
assert.throws(fn[, error][, message])#
fn<Function>error<RegExp>|<Function>|<Object>|<Error>message<string>
期望函数 fn 抛出错误。
如果指定,error 可以是 Class、<RegExp>、验证函数、每个属性都将被测试严格深度相等的验证对象,或错误实例(包括其不可枚举的 message 和 name 属性)。当使用对象时,在针对字符串属性进行验证时也可以使用正则表达式。请参见下文示例。
如果指定,当 fn 调用未抛出错误或者错误验证失败时,message 将附加到 AssertionError 提供的消息中。
自定义验证对象/错误实例
import assert from 'node:assert/strict'; const err = new TypeError('Wrong value'); err.code = 404; err.foo = 'bar'; err.info = { nested: true, baz: 'text', }; err.reg = /abc/i; assert.throws( () => { throw err; }, { name: 'TypeError', message: 'Wrong value', info: { nested: true, baz: 'text', }, // Only properties on the validation object will be tested for. // Using nested objects requires all properties to be present. Otherwise // the validation is going to fail. }, ); // Using regular expressions to validate error properties: assert.throws( () => { throw err; }, { // The `name` and `message` properties are strings and using regular // expressions on those will match against the string. If they fail, an // error is thrown. name: /^TypeError$/, message: /Wrong/, foo: 'bar', info: { nested: true, // It is not possible to use regular expressions for nested properties! baz: 'text', }, // The `reg` property contains a regular expression and only if the // validation object contains an identical regular expression, it is going // to pass. reg: /abc/i, }, ); // Fails due to the different `message` and `name` properties: assert.throws( () => { const otherErr = new Error('Not found'); // Copy all enumerable properties from `err` to `otherErr`. for (const [key, value] of Object.entries(err)) { otherErr[key] = value; } throw otherErr; }, // The error's `message` and `name` properties will also be checked when using // an error as validation object. err, );const assert = require('node:assert/strict'); const err = new TypeError('Wrong value'); err.code = 404; err.foo = 'bar'; err.info = { nested: true, baz: 'text', }; err.reg = /abc/i; assert.throws( () => { throw err; }, { name: 'TypeError', message: 'Wrong value', info: { nested: true, baz: 'text', }, // Only properties on the validation object will be tested for. // Using nested objects requires all properties to be present. Otherwise // the validation is going to fail. }, ); // Using regular expressions to validate error properties: assert.throws( () => { throw err; }, { // The `name` and `message` properties are strings and using regular // expressions on those will match against the string. If they fail, an // error is thrown. name: /^TypeError$/, message: /Wrong/, foo: 'bar', info: { nested: true, // It is not possible to use regular expressions for nested properties! baz: 'text', }, // The `reg` property contains a regular expression and only if the // validation object contains an identical regular expression, it is going // to pass. reg: /abc/i, }, ); // Fails due to the different `message` and `name` properties: assert.throws( () => { const otherErr = new Error('Not found'); // Copy all enumerable properties from `err` to `otherErr`. for (const [key, value] of Object.entries(err)) { otherErr[key] = value; } throw otherErr; }, // The error's `message` and `name` properties will also be checked when using // an error as validation object. err, );
使用构造函数验证 instanceof
import assert from 'node:assert/strict'; assert.throws( () => { throw new Error('Wrong value'); }, Error, );const assert = require('node:assert/strict'); assert.throws( () => { throw new Error('Wrong value'); }, Error, );
使用 <RegExp> 验证错误消息
使用正则表达式会在错误对象上运行 .toString,因此也会包含错误名称。
import assert from 'node:assert/strict'; assert.throws( () => { throw new Error('Wrong value'); }, /^Error: Wrong value$/, );const assert = require('node:assert/strict'); assert.throws( () => { throw new Error('Wrong value'); }, /^Error: Wrong value$/, );
自定义错误验证
该函数必须返回 true 以表明所有内部验证均已通过。否则它将因 AssertionError 而失败。
import assert from 'node:assert/strict'; assert.throws( () => { throw new Error('Wrong value'); }, (err) => { assert(err instanceof Error); assert(/value/.test(err)); // Avoid returning anything from validation functions besides `true`. // Otherwise, it's not clear what part of the validation failed. Instead, // throw an error about the specific validation that failed (as done in this // example) and add as much helpful debugging information to that error as // possible. return true; }, 'unexpected error', );const assert = require('node:assert/strict'); assert.throws( () => { throw new Error('Wrong value'); }, (err) => { assert(err instanceof Error); assert(/value/.test(err)); // Avoid returning anything from validation functions besides `true`. // Otherwise, it's not clear what part of the validation failed. Instead, // throw an error about the specific validation that failed (as done in this // example) and add as much helpful debugging information to that error as // possible. return true; }, 'unexpected error', );
error 不能是字符串。如果第二个参数提供了字符串,则认为 error 被省略,字符串将用作 message。这容易导致忽视错误。使用与抛出的错误消息相同的消息将导致 ERR_AMBIGUOUS_ARGUMENT 错误。如果考虑使用字符串作为第二个参数,请仔细阅读下例。
import assert from 'node:assert/strict'; function throwingFirst() { throw new Error('First'); } function throwingSecond() { throw new Error('Second'); } function notThrowing() {} // The second argument is a string and the input function threw an Error. // The first case will not throw as it does not match for the error message // thrown by the input function! assert.throws(throwingFirst, 'Second'); // In the next example the message has no benefit over the message from the // error and since it is not clear if the user intended to actually match // against the error message, Node.js throws an `ERR_AMBIGUOUS_ARGUMENT` error. assert.throws(throwingSecond, 'Second'); // TypeError [ERR_AMBIGUOUS_ARGUMENT] // The string is only used (as message) in case the function does not throw: assert.throws(notThrowing, 'Second'); // AssertionError [ERR_ASSERTION]: Missing expected exception: Second // If it was intended to match for the error message do this instead: // It does not throw because the error messages match. assert.throws(throwingSecond, /Second$/); // If the error message does not match, an AssertionError is thrown. assert.throws(throwingFirst, /Second$/); // AssertionError [ERR_ASSERTION]const assert = require('node:assert/strict'); function throwingFirst() { throw new Error('First'); } function throwingSecond() { throw new Error('Second'); } function notThrowing() {} // The second argument is a string and the input function threw an Error. // The first case will not throw as it does not match for the error message // thrown by the input function! assert.throws(throwingFirst, 'Second'); // In the next example the message has no benefit over the message from the // error and since it is not clear if the user intended to actually match // against the error message, Node.js throws an `ERR_AMBIGUOUS_ARGUMENT` error. assert.throws(throwingSecond, 'Second'); // TypeError [ERR_AMBIGUOUS_ARGUMENT] // The string is only used (as message) in case the function does not throw: assert.throws(notThrowing, 'Second'); // AssertionError [ERR_ASSERTION]: Missing expected exception: Second // If it was intended to match for the error message do this instead: // It does not throw because the error messages match. assert.throws(throwingSecond, /Second$/); // If the error message does not match, an AssertionError is thrown. assert.throws(throwingFirst, /Second$/); // AssertionError [ERR_ASSERTION]
由于容易产生混淆和错误,请避免将字符串用作第二个参数。
assert.partialDeepStrictEqual(actual, expected[, message])#
actual<any>expected<any>message<string>|<Error>|<Function>
测试 actual 和 expected 参数之间的部分深度相等性。“深度”相等意味着子对象的可枚举“自有”属性也会按照以下规则递归计算。“部分”相等意味着仅比较 expected 参数上存在的属性。
此方法始终通过与 assert.deepStrictEqual() 相同的测试用例,作为其超集表现。
比较详情#
- 原始值使用
Object.is()进行比较。 - 对象的 类型标签 应相同。
- 对象的
[[Prototype]]不会被比较。 - 仅考虑 可枚举“自有”属性。
<Error>的名称、消息、原因和错误始终会进行比较,即使它们不是可枚举属性。errors属性也会进行比较。- 可枚举的自有
<Symbol>属性也会进行比较。 - 对象包装器将同时作为对象和解包后的值进行比较。
Object属性以无序方式比较。<Map>键和<Set>项以无序方式比较。- 递归在双方不同或双方遇到循环引用时停止。
<WeakMap>、<WeakSet>和<Promise>实例不进行结构比较。它们仅在引用同一对象时相等。任何不同WeakMap、WeakSet或Promise实例之间的比较都将导致不等,即使它们包含相同的内容。<RegExp>的 lastIndex、flags 和 source 始终会进行比较,即使它们不是可枚举属性。- 稀疏数组中的空位(holes)会被忽略。
import assert from 'node:assert'; assert.partialDeepStrictEqual( { a: { b: { c: 1 } } }, { a: { b: { c: 1 } } }, ); // OK assert.partialDeepStrictEqual( { a: 1, b: 2, c: 3 }, { b: 2 }, ); // OK assert.partialDeepStrictEqual( [1, 2, 3, 4, 5, 6, 7, 8, 9], [4, 5, 8], ); // OK assert.partialDeepStrictEqual( new Set([{ a: 1 }, { b: 1 }]), new Set([{ a: 1 }]), ); // OK assert.partialDeepStrictEqual( new Map([['key1', 'value1'], ['key2', 'value2']]), new Map([['key2', 'value2']]), ); // OK assert.partialDeepStrictEqual(123n, 123n); // OK assert.partialDeepStrictEqual( [1, 2, 3, 4, 5, 6, 7, 8, 9], [5, 4, 8], ); // AssertionError assert.partialDeepStrictEqual( { a: 1 }, { a: 1, b: 2 }, ); // AssertionError assert.partialDeepStrictEqual( { a: { b: 2 } }, { a: { b: '2' } }, ); // AssertionErrorconst assert = require('node:assert'); assert.partialDeepStrictEqual( { a: { b: { c: 1 } } }, { a: { b: { c: 1 } } }, ); // OK assert.partialDeepStrictEqual( { a: 1, b: 2, c: 3 }, { b: 2 }, ); // OK assert.partialDeepStrictEqual( [1, 2, 3, 4, 5, 6, 7, 8, 9], [4, 5, 8], ); // OK assert.partialDeepStrictEqual( new Set([{ a: 1 }, { b: 1 }]), new Set([{ a: 1 }]), ); // OK assert.partialDeepStrictEqual( new Map([['key1', 'value1'], ['key2', 'value2']]), new Map([['key2', 'value2']]), ); // OK assert.partialDeepStrictEqual(123n, 123n); // OK assert.partialDeepStrictEqual( [1, 2, 3, 4, 5, 6, 7, 8, 9], [5, 4, 8], ); // AssertionError assert.partialDeepStrictEqual( { a: 1 }, { a: 1, b: 2 }, ); // AssertionError assert.partialDeepStrictEqual( { a: { b: 2 } }, { a: { b: '2' } }, ); // AssertionError