التأكيد
[مستقر: 2 - مستقر]
مستقر: 2 الاستقرار: 2 - مستقر
شفرة المصدر: lib/assert.js
توفر الوحدة node:assert
مجموعة من دوال التأكيد للتحقق من الثوابت.
وضع التأكيد الصارم
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | تم عرضه كـ require('node:assert/strict') . |
v13.9.0, v12.16.2 | تم تغيير "الوضع الصارم" إلى "وضع التأكيد الصارم" و "الوضع القديم" إلى "وضع التأكيد القديم" لتجنب الخلط مع المعنى الأكثر شيوعًا لـ "الوضع الصارم". |
v9.9.0 | تمت إضافة اختلافات الأخطاء إلى وضع التأكيد الصارم. |
v9.9.0 | تمت إضافة وضع التأكيد الصارم إلى وحدة التأكيد. |
v9.9.0 | تمت الإضافة في: v9.9.0 |
في وضع التأكيد الصارم، تتصرف الطرق غير الصارمة مثل الطرق الصارمة المقابلة لها. على سبيل المثال، ستتصرف assert.deepEqual()
مثل assert.deepStrictEqual()
.
في وضع التأكيد الصارم، تعرض رسائل الخطأ للكائنات فرقًا. في وضع التأكيد القديم، تعرض رسائل الخطأ للكائنات الكائنات، وغالبًا ما تكون مبتورة.
لاستخدام وضع التأكيد الصارم:
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()
:
// تحذير: هذا لا يطرح AssertionError في وضع التأكيد القديم!
assert.deepEqual(/a/gi, new Date());
الفئة: assert.AssertionError
- يمتد: <errors.Error>
يشير إلى فشل التأكيد. جميع الأخطاء التي يطرحها وحدة node:assert
ستكون مثيلات لفئة AssertionError
.
new assert.AssertionError(options)
تمت الإضافة في: v0.1.21
options
<Object>message
<string> في حالة توفره، يتم تعيين رسالة الخطأ إلى هذه القيمة.actual
<any> خاصيةactual
على مثيل الخطأ.expected
<any> خاصيةexpected
على مثيل الخطأ.operator
<string> خاصيةoperator
على مثيل الخطأ.stackStartFn
<Function> في حالة توفره، يتجاهل تتبع المكدس الذي تم إنشاؤه الإطارات قبل هذه الوظيفة.
فئة فرعية من Error
تشير إلى فشل التأكيد.
تحتوي جميع المثيلات على خصائص Error
المضمنة (message
و name
) و:
actual
<any> تم تعيينه للوسيطةactual
لطرق مثلassert.strictEqual()
.expected
<any> تم تعيينه للقيمةexpected
لطرق مثلassert.strictEqual()
.generatedMessage
<boolean> يشير إلى ما إذا كانت الرسالة قد تم إنشاؤها تلقائيًا (true
) أم لا.code
<string> القيمة دائمًاERR_ASSERTION
لإظهار أن الخطأ هو خطأ تأكيد.operator
<string> تم تعيينه لقيمة المشغل التي تم تمريرها.
import assert from 'node:assert';
// قم بإنشاء AssertionError لمقارنة رسالة الخطأ لاحقًا:
const { message } = new assert.AssertionError({
actual: 1,
expected: 2,
operator: 'strictEqual',
});
// تحقق من إخراج الخطأ:
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');
// قم بإنشاء AssertionError لمقارنة رسالة الخطأ لاحقًا:
const { message } = new assert.AssertionError({
actual: 1,
expected: 2,
operator: 'strictEqual',
});
// تحقق من إخراج الخطأ:
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.CallTracker
[السجل]
الإصدار | التغييرات |
---|---|
v20.1.0 | تم إهمال الفئة assert.CallTracker وستتم إزالتها في إصدار مستقبلي. |
v14.2.0, v12.19.0 | تمت الإضافة في: v14.2.0, v12.19.0 |
[مستقر: 0 - مهمل]
مستقر: 0 الاستقرار: 0 - مهمل
هذه الميزة مهملة وستتم إزالتها في إصدار مستقبلي. يرجى التفكير في استخدام بدائل مثل الدالة المساعدة mock
.
new assert.CallTracker()
تمت الإضافة في: v14.2.0, v12.19.0
يقوم بإنشاء كائن CallTracker
جديد يمكن استخدامه لتتبع ما إذا كانت الدوال قد تم استدعاؤها لعدد معين من المرات. يجب استدعاء tracker.verify()
لكي يتم التحقق. النمط المعتاد هو استدعاؤه في معالج process.on('exit')
.
import assert from 'node:assert';
import process from 'node:process';
const tracker = new assert.CallTracker();
function func() {}
// يجب استدعاء callsfunc() مرة واحدة بالضبط قبل tracker.verify().
const callsfunc = tracker.calls(func, 1);
callsfunc();
// يستدعي tracker.verify() ويتحقق مما إذا كانت جميع دوال tracker.calls() قد تم
// استدعاؤها بالعدد المحدد من المرات.
process.on('exit', () => {
tracker.verify();
});
const assert = require('node:assert');
const process = require('node:process');
const tracker = new assert.CallTracker();
function func() {}
// يجب استدعاء callsfunc() مرة واحدة بالضبط قبل tracker.verify().
const callsfunc = tracker.calls(func, 1);
callsfunc();
// يستدعي tracker.verify() ويتحقق مما إذا كانت جميع دوال tracker.calls() قد تم
// استدعاؤها بالعدد المحدد من المرات.
process.on('exit', () => {
tracker.verify();
});
tracker.calls([fn][, exact])
تمت الإضافة في: v14.2.0, v12.19.0
fn
<Function> افتراضي: دالة لا تفعل شيئًا.exact
<number> افتراضي:1
.- الإرجاع: <Function> دالة تغلف
fn
.
من المتوقع استدعاء الدالة المغلفة بالضبط exact
مرة. إذا لم يتم استدعاء الدالة بالضبط exact
مرة عند استدعاء tracker.verify()
، فسيؤدي tracker.verify()
إلى ظهور خطأ.
import assert from 'node:assert';
// إنشاء متتبع الاستدعاءات.
const tracker = new assert.CallTracker();
function func() {}
// يُرجع دالة تغلف func() يجب استدعاؤها بالعدد المحدد من المرات
// قبل tracker.verify().
const callsfunc = tracker.calls(func);
const assert = require('node:assert');
// إنشاء متتبع الاستدعاءات.
const tracker = new assert.CallTracker();
function func() {}
// يُرجع دالة تغلف func() يجب استدعاؤها بالعدد المحدد من المرات
// قبل tracker.verify().
const callsfunc = tracker.calls(func);
tracker.getCalls(fn)
إضافة في: v18.8.0, v16.18.0
fn
<Function>- المرتجعات: <Array> مصفوفة تحتوي على جميع استدعاءات دالة مُتعقَّبة.
- الكائن <Object>
import assert from 'node:assert';
const tracker = new assert.CallTracker();
function func() {}
const callsfunc = tracker.calls(func);
callsfunc(1, 2, 3);
assert.deepStrictEqual(tracker.getCalls(callsfunc),
[{ thisArg: undefined, arguments: [1, 2, 3] }]);
const assert = require('node:assert');
// Creates call tracker.
const tracker = new assert.CallTracker();
function func() {}
const callsfunc = tracker.calls(func);
callsfunc(1, 2, 3);
assert.deepStrictEqual(tracker.getCalls(callsfunc),
[{ thisArg: undefined, arguments: [1, 2, 3] }]);
tracker.report()
إضافة في: v14.2.0, v12.19.0
- المرتجعات: <Array> مصفوفة من الكائنات التي تحتوي على معلومات حول الدوال المغلّفة التي تم إرجاعها بواسطة
tracker.calls()
. - الكائن <Object>
تحتوي المصفوفات على معلومات حول العدد المتوقع والفعلي لاستدعاءات الدوال التي لم يتم استدعاؤها بالعدد المتوقع من المرات.
import assert from 'node:assert';
// Creates call tracker.
const tracker = new assert.CallTracker();
function func() {}
// Returns a function that wraps func() that must be called exact times
// before tracker.verify().
const callsfunc = tracker.calls(func, 2);
// Returns an array containing information on callsfunc()
console.log(tracker.report());
// [
// {
// message: 'Expected the func function to be executed 2 time(s) but was
// executed 0 time(s).',
// actual: 0,
// expected: 2,
// operator: 'func',
// stack: stack trace
// }
// ]
const assert = require('node:assert');
// Creates call tracker.
const tracker = new assert.CallTracker();
function func() {}
// Returns a function that wraps func() that must be called exact times
// before tracker.verify().
const callsfunc = tracker.calls(func, 2);
// Returns an array containing information on callsfunc()
console.log(tracker.report());
// [
// {
// message: 'Expected the func function to be executed 2 time(s) but was
// executed 0 time(s).',
// actual: 0,
// expected: 2,
// operator: 'func',
// stack: stack trace
// }
// ]
tracker.reset([fn])
تمت إضافتها في: v18.8.0، v16.18.0
fn
<Function> دالة مُتتبَّعة لإعادة ضبطها.
تعيد ضبط استدعاءات أداة تعقب الاستدعاءات. إذا تم تمرير دالة مُتتبَّعة كوسيطة، فسيتم إعادة ضبط الاستدعاءات الخاصة بها. إذا لم يتم تمرير أي وسيطات، فسيتم إعادة ضبط جميع الدوال المُتتبَّعة.
import assert from 'node:assert';
const tracker = new assert.CallTracker();
function func() {}
const callsfunc = tracker.calls(func);
callsfunc();
// تم استدعاء أداة التعقب مرة واحدة
assert.strictEqual(tracker.getCalls(callsfunc).length, 1);
tracker.reset(callsfunc);
assert.strictEqual(tracker.getCalls(callsfunc).length, 0);
const assert = require('node:assert');
const tracker = new assert.CallTracker();
function func() {}
const callsfunc = tracker.calls(func);
callsfunc();
// تم استدعاء أداة التعقب مرة واحدة
assert.strictEqual(tracker.getCalls(callsfunc).length, 1);
tracker.reset(callsfunc);
assert.strictEqual(tracker.getCalls(callsfunc).length, 0);
tracker.verify()
تمت إضافتها في: v14.2.0، v12.19.0
تتكرر عبر قائمة الدوال التي تم تمريرها إلى tracker.calls()
وستُطلق خطأً للدوال التي لم يتم استدعاؤها بالعدد المتوقع من المرات.
import assert from 'node:assert';
// إنشاء أداة تعقب الاستدعاءات.
const tracker = new assert.CallTracker();
function func() {}
// تُرجع دالة تغلف func() التي يجب استدعاؤها عددًا محددًا من المرات
// قبل tracker.verify().
const callsfunc = tracker.calls(func, 2);
callsfunc();
// سيُطلق خطأً نظرًا لأن callsfunc() تم استدعاؤها مرة واحدة فقط.
tracker.verify();
const assert = require('node:assert');
// إنشاء أداة تعقب الاستدعاءات.
const tracker = new assert.CallTracker();
function func() {}
// تُرجع دالة تغلف func() التي يجب استدعاؤها عددًا محددًا من المرات
// قبل tracker.verify().
const callsfunc = tracker.calls(func, 2);
callsfunc();
// سيُطلق خطأً نظرًا لأن callsfunc() تم استدعاؤها مرة واحدة فقط.
tracker.verify();
assert(value[, message])
أُضيف في: v0.5.9
اسم مستعار لـ assert.ok()
.
assert.deepEqual(actual, expected[, message])
[تاريخ الإصدار]
الإصدار | التغييرات |
---|---|
v22.2.0, v20.15.0 | تتم الآن مقارنة خاصية سبب الخطأ (Error cause) وخاصية الأخطاء (errors) أيضًا. |
v18.0.0 | تتم الآن مقارنة خاصية lastIndex للتعبيرات النمطية أيضًا. |
v16.0.0, v14.18.0 | في وضع التأكيد القديم، تم تغيير الحالة من مُهملة إلى قديمة. |
v14.0.0 | يتم الآن التعامل مع NaN على أنها متطابقة إذا كان كلا الجانبين NaN. |
v12.0.0 | تتم الآن مقارنة علامات النوع بشكل صحيح وهناك بعض التعديلات الطفيفة في المقارنة لجعل التحقق أقل إثارة للدهشة. |
v9.0.0 | تتم الآن مقارنة أسماء ورسائل Error بشكل صحيح. |
v8.0.0 | تتم أيضًا مقارنة محتوى Set و Map . |
v6.4.0, v4.7.1 | يتم الآن التعامل مع شرائح المصفوفة المكتوبة بشكل صحيح. |
v6.1.0, v4.5.0 | يمكن الآن استخدام الكائنات ذات المراجع الدائرية كمدخلات. |
v5.10.1, v4.4.3 | التعامل مع المصفوفات المكتوبة غير Uint8Array بشكل صحيح. |
v0.1.21 | أُضيف في: v0.1.21 |
وضع التأكيد الصارم
اسم مستعار لـ assert.deepStrictEqual()
.
وضع التأكيد القديم
[مستقر: 3 - قديم]
مستقر: 3 الاستقرار: 3 - قديم: استخدم assert.deepStrictEqual()
بدلاً من ذلك.
يختبر المساواة العميقة بين المعاملين actual
و expected
. يفضل استخدام assert.deepStrictEqual()
بدلاً من ذلك. قد تكون لـ assert.deepEqual()
نتائج مفاجئة.
المساواة العميقة تعني أن الخصائص "الخاصة" القابلة للتعداد للكائنات الفرعية يتم تقييمها أيضًا بشكل متكرر وفقًا للقواعد التالية.
تفاصيل المقارنة
- تتم مقارنة القيم الأولية باستخدام
==
عامل التشغيل، باستثناءNaN
. يتم التعامل معها على أنها متطابقة في حالة كون كلا الجانبينNaN
. - يجب أن تكون علامات النوع للكائنات هي نفسها.
- يتم أخذ الخصائص "الخاصة" القابلة للتعداد فقط في الاعتبار.
- تتم دائمًا مقارنة أسماء
Error
ورسائلها وأسبابها وأخطائها، حتى لو لم تكن هذه خصائص قابلة للتعداد. - تتم مقارنة أغلفة الكائنات ككائنات وقيم غير مغلفة.
- تتم مقارنة خصائص
Object
بترتيب غير محدد. - تتم مقارنة مفاتيح
Map
وعناصرSet
بترتيب غير محدد. - يتوقف الاستدعاء الذاتي عندما يختلف الجانبان أو يواجه الجانبان مرجعًا دائريًا.
- لا يختبر التنفيذ
[[Prototype]]
للكائنات. - لا تتم مقارنة خصائص
Symbol
. - لا تعتمد مقارنة
WeakMap
وWeakSet
على قيمهما ولكن فقط على مثيلاتهما. - تتم دائمًا مقارنة lastIndex والأعلام والمصدر
RegExp
، حتى لو لم تكن هذه خصائص قابلة للتعداد.
المثال التالي لا يطرح 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])
[السجل]
الإصدار | التغييرات |
---|---|
v22.2.0, v20.15.0 | تتم الآن مقارنة خاصية سبب الخطأ وخصائص الأخطاء أيضًا. |
v18.0.0 | تتم الآن مقارنة خاصية lastIndex للتعبيرات النمطية أيضًا. |
v9.0.0 | تتم الآن مقارنة خصائص الرموز القابلة للتعداد. |
v9.0.0 | تتم الآن مقارنة NaN باستخدام مقارنة SameValueZero. |
v8.5.0 | تتم الآن مقارنة أسماء ورسائل Error بشكل صحيح. |
v8.0.0 | تتم أيضًا مقارنة محتوى Set و Map . |
v6.1.0 | يمكن الآن استخدام الكائنات ذات المراجع الدائرية كمدخلات. |
v6.4.0, v4.7.1 | يتم الآن التعامل مع شرائح المصفوفة المكتوبة بشكل صحيح. |
v5.10.1, v4.4.3 | التعامل مع المصفوفات المكتوبة غير Uint8Array بشكل صحيح. |
v1.2.0 | تمت إضافته في: v1.2.0 |
يختبر المساواة العميقة بين المعاملات actual
و expected
. تعني المساواة "العميقة" أن خصائص "الملكية" القابلة للتعداد للكائنات الفرعية يتم تقييمها بشكل متكرر أيضًا وفقًا للقواعد التالية.
تفاصيل المقارنة
- تتم مقارنة القيم الأولية باستخدام
Object.is()
. - يجب أن تكون علامات النوع للكائنات هي نفسها.
- تتم مقارنة
[[Prototype]]
للكائنات باستخدام===
operator. - يتم اعتبار خصائص "الملكية" القابلة للتعداد فقط.
- تتم دائمًا مقارنة أسماء ورسائل وأسباب وأخطاء
Error
، حتى لو لم تكن هذه خصائص قابلة للتعداد. تتم أيضًا مقارنةerrors
. - تتم أيضًا مقارنة خصائص
Symbol
"الملكية" القابلة للتعداد. - تتم مقارنة أغلفة الكائنات ككائنات وقيم غير مغلفة.
- تتم مقارنة خصائص
Object
بدون ترتيب. - تتم مقارنة مفاتيح
Map
وعناصرSet
بدون ترتيب. - يتوقف التكرار عندما يختلف الجانبان أو يواجه الجانبان مرجعًا دائريًا.
- لا تعتمد مقارنة
WeakMap
وWeakSet
على قيمهما. انظر أدناه لمزيد من التفاصيل. - تتم دائمًا مقارنة آخر فهرس وأعلام ومصدر
RegExp
، حتى لو لم تكن هذه خصائص قابلة للتعداد.
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 weakMap3 = new WeakMap();
weakMap3.unequal = true;
assert.deepStrictEqual(weakMap1, weakMap2);
// OK, because it is impossible to compare the entries
// Fails because weakMap3 has a property that weakMap1 does not contain:
assert.deepStrictEqual(weakMap1, weakMap3);
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// WeakMap {
// + [items unknown]
// - [items unknown],
// - unequal: true
// }
const 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 weakMap3 = new WeakMap();
weakMap3.unequal = true;
assert.deepStrictEqual(weakMap1, weakMap2);
// OK, because it is impossible to compare the entries
// Fails because weakMap3 has a property that weakMap1 does not contain:
assert.deepStrictEqual(weakMap1, weakMap3);
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// WeakMap {
// + [items unknown]
// - [items unknown],
// - unequal: true
// }
إذا لم تكن القيم متساوية، فسيتم طرح AssertionError
مع تعيين خاصية message
مساوية لقيمة المعامل message
. إذا كان المعامل message
غير محدد، فسيتم تعيين رسالة خطأ افتراضية. إذا كان المعامل message
مثيلاً لـ Error
، فسيتم طرحه بدلاً من AssertionError
.
assert.doesNotMatch(string, regexp[, message])
[السجل]
الإصدار | التغييرات |
---|---|
v16.0.0 | واجهة برمجة التطبيقات هذه لم تعد تجريبية. |
v13.6.0, v12.16.0 | تمت إضافتها في: v13.6.0, v12.16.0 |
يتوقع ألا يتطابق إدخال string
مع التعبير النمطي.
import assert from 'node:assert/strict';
assert.doesNotMatch('I will fail', /fail/);
// AssertionError [ERR_ASSERTION]: كان من المتوقع ألا يتطابق الإدخال مع ...
assert.doesNotMatch(123, /pass/);
// AssertionError [ERR_ASSERTION]: يجب أن يكون وسيط "string" من النوع string.
assert.doesNotMatch('I will pass', /different/);
// OK
const assert = require('node:assert/strict');
assert.doesNotMatch('I will fail', /fail/);
// AssertionError [ERR_ASSERTION]: كان من المتوقع ألا يتطابق الإدخال مع ...
assert.doesNotMatch(123, /pass/);
// AssertionError [ERR_ASSERTION]: يجب أن يكون وسيط "string" من النوع string.
assert.doesNotMatch('I will pass', /different/);
// OK
إذا تطابقت القيم، أو إذا كان وسيط string
من نوع آخر غير string
، فسيتم طرح AssertionError
مع تعيين الخاصية message
مساوية لقيمة المعلمة message
. إذا كانت المعلمة message
غير محددة، فسيتم تعيين رسالة خطأ افتراضية. إذا كانت المعلمة message
مثيلاً لـ Error
فسيتم طرحها بدلاً من AssertionError
.
assert.doesNotReject(asyncFn[, error][, message])
تمت إضافتها في: v10.0.0
asyncFn
<Function> | <Promise>error
<RegExp> | <Function>message
<string>
ينتظر وعد asyncFn
أو، إذا كانت asyncFn
دالة، فإنه يستدعي الدالة على الفور وينتظر اكتمال الوعد الذي تم إرجاعه. ثم سيتحقق من أن الوعد لم يتم رفضه.
إذا كانت asyncFn
دالة وطرحت خطأ بشكل متزامن، فسوف تُرجع assert.doesNotReject()
Promise
مرفوضًا مع هذا الخطأ. إذا لم تُرجع الدالة وعدًا، فسوف تُرجع assert.doesNotReject()
Promise
مرفوضًا مع خطأ ERR_INVALID_RETURN_VALUE
. في كلتا الحالتين، يتم تخطي معالج الأخطاء.
في الواقع، استخدام 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])
[السجل]
الإصدار | التغييرات |
---|---|
v5.11.0, v4.4.5 | يتم احترام المعامل message الآن. |
v4.2.0 | يمكن أن يكون المعامل error الآن دالة سهمية. |
v0.1.21 | تمت الإضافة في: v0.1.21 |
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,
);
ومع ذلك، سينتج عن ما يلي AssertionError
مع الرسالة 'Got unwanted exception...' (تم الحصول على استثناء غير مرغوب فيه...):
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: Whoops
const 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])
[السجل]
الإصدار | التغييرات |
---|---|
v16.0.0, v14.18.0 | في وضع التأكيد القديم، تم تغيير الحالة من مُهمل إلى قديم. |
v14.0.0 | يتم الآن التعامل مع NaN على أنها متطابقة إذا كان كلا الجانبين NaN. |
v0.1.21 | تمت الإضافة في: v0.1.21 |
وضع التأكيد الصارم
اسم مستعار لـ assert.strictEqual()
.
وضع التأكيد القديم
[مستقر: 3 - قديم]
مستقر: 3 الاستقرار: 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])
أضيف في: v0.1.21
يطرح 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 array
const 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.fail()
مع أكثر من وسيطتين ممكن ولكنه مهمل. انظر أدناه لمزيد من التفاصيل.
assert.fail(actual, expected[, message[, operator[, stackStartFn]]])
[السجل]
الإصدار | التغييرات |
---|---|
v10.0.0 | استدعاء assert.fail() مع أكثر من وسيطة واحدة مهمل ويصدر تحذيرًا. |
v0.1.21 | أضيف في: v0.1.21 |
[مستقر: 0 - مهمل]
مستقر: 0 الاستقرار: 0 - مهمل: استخدم assert.fail([message])
أو دوال assert الأخرى بدلاً من ذلك.
actual
<any>expected
<any>message
<string> | <Error>operator
<string> الافتراضي:'!='
stackStartFn
<Function> الافتراضي:assert.fail
إذا كان message
غير صحيح، فسيتم تعيين رسالة الخطأ على أنها قيم actual
و expected
مفصولة بواسطة operator
المقدم. إذا تم توفير وسيطتين actual
و expected
فقط، فسيكون operator
افتراضيًا '!='
. إذا تم توفير message
كوسيطة ثالثة، فسيتم استخدامه كرسالة خطأ وسيتم تخزين الوسائط الأخرى كخصائص على الكائن المطروح. إذا تم توفير stackStartFn
، فسيتم إزالة جميع إطارات المكدس أعلى هذه الدالة من تتبع المكدس (راجع Error.captureStackTrace
). إذا لم يتم إعطاء أي وسيطات، فسيتم استخدام الرسالة الافتراضية Failed
.
import assert from 'node:assert/strict';
assert.fail('a', 'b');
// AssertionError [ERR_ASSERTION]: 'a' != 'b'
assert.fail(1, 2, undefined, '>');
// AssertionError [ERR_ASSERTION]: 1 > 2
assert.fail(1, 2, 'fail');
// AssertionError [ERR_ASSERTION]: fail
assert.fail(1, 2, 'whoops', '>');
// AssertionError [ERR_ASSERTION]: whoops
assert.fail(1, 2, new TypeError('need array'));
// TypeError: need array
const assert = require('node:assert/strict');
assert.fail('a', 'b');
// AssertionError [ERR_ASSERTION]: 'a' != 'b'
assert.fail(1, 2, undefined, '>');
// AssertionError [ERR_ASSERTION]: 1 > 2
assert.fail(1, 2, 'fail');
// AssertionError [ERR_ASSERTION]: fail
assert.fail(1, 2, 'whoops', '>');
// AssertionError [ERR_ASSERTION]: whoops
assert.fail(1, 2, new TypeError('need array'));
// TypeError: need array
في الحالات الثلاث الأخيرة، لا يوجد لـ actual
و expected
و operator
أي تأثير على رسالة الخطأ.
مثال على استخدام stackStartFn
لتقصير تتبع مكدس الاستثناء:
import assert from 'node:assert/strict';
function suppressFrame() {
assert.fail('a', 'b', undefined, '!==', suppressFrame);
}
suppressFrame();
// AssertionError [ERR_ASSERTION]: 'a' !== 'b'
// at repl:1:1
// at ContextifyScript.Script.runInThisContext (vm.js:44:33)
// ...
const assert = require('node:assert/strict');
function suppressFrame() {
assert.fail('a', 'b', undefined, '!==', suppressFrame);
}
suppressFrame();
// AssertionError [ERR_ASSERTION]: 'a' !== 'b'
// at repl:1:1
// at ContextifyScript.Script.runInThisContext (vm.js:44:33)
// ...
assert.ifError(value)
[التاريخ]
الإصدار | التغييرات |
---|---|
الإصدار v10.0.0 | بدلاً من إطلاق الخطأ الأصلي، يتم الآن تضمينه في [AssertionError ][] التي تحتوي على تتبع المكدس الكامل. |
الإصدار v10.0.0 | قد تكون القيمة الآن undefined أو null فقط. قبل ذلك، كانت جميع القيم الزائفة تُعامل بنفس طريقة null ولم يتم إطلاق أي خطأ. |
الإصدار v0.1.97 | تمت إضافته في: v0.1.97 |
value
<any>
يطرح value
إذا لم تكن value
هي undefined
أو null
. هذا مفيد عند اختبار وسيطة error
في عمليات الاسترجاع. يحتوي تتبع المكدس على جميع الإطارات من الخطأ الذي تم تمريره إلى ifError()
بما في ذلك الإطارات الجديدة المحتملة لـ ifError()
نفسها.
import assert from 'node:assert/strict';
assert.ifError(null);
// OK
assert.ifError(0);
// AssertionError [ERR_ASSERTION]: ifError حصلت على استثناء غير مرغوب فيه: 0
assert.ifError('error');
// AssertionError [ERR_ASSERTION]: ifError حصلت على استثناء غير مرغوب فيه: 'error'
assert.ifError(new Error());
// AssertionError [ERR_ASSERTION]: ifError حصلت على استثناء غير مرغوب فيه: Error
// قم بإنشاء بعض إطارات الخطأ العشوائية.
let err;
(function errorFrame() {
err = new Error('test error');
})();
(function ifErrorFrame() {
assert.ifError(err);
})();
// AssertionError [ERR_ASSERTION]: ifError حصلت على استثناء غير مرغوب فيه: test error
// at ifErrorFrame
// at errorFrame
const assert = require('node:assert/strict');
assert.ifError(null);
// OK
assert.ifError(0);
// AssertionError [ERR_ASSERTION]: ifError حصلت على استثناء غير مرغوب فيه: 0
assert.ifError('error');
// AssertionError [ERR_ASSERTION]: ifError حصلت على استثناء غير مرغوب فيه: 'error'
assert.ifError(new Error());
// AssertionError [ERR_ASSERTION]: ifError حصلت على استثناء غير مرغوب فيه: Error
// قم بإنشاء بعض إطارات الخطأ العشوائية.
let err;
(function errorFrame() {
err = new Error('test error');
})();
(function ifErrorFrame() {
assert.ifError(err);
})();
// AssertionError [ERR_ASSERTION]: ifError حصلت على استثناء غير مرغوب فيه: test error
// at ifErrorFrame
// at errorFrame
assert.match(string, regexp[, message])
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار v16.0.0 | لم تعد واجهة برمجة التطبيقات هذه تجريبية. |
الإصدار v13.6.0، الإصدار v12.16.0 | تمت الإضافة في: الإصدار v13.6.0، الإصدار v12.16.0 |
يتوقع أن تتطابق مدخلات 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/);
// OK
const 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
من نوع آخر غير string
، فسيتم طرح AssertionError
مع تعيين خاصية message
مساوية لقيمة المعامل message
. إذا كان المعامل message
غير معرف، فسيتم تعيين رسالة خطأ افتراضية. إذا كان المعامل message
مثيلاً لـ Error
فسيتم طرحه بدلاً من AssertionError
.
assert.notDeepEqual(actual, expected[, message])
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار v16.0.0، الإصدار v14.18.0 | في وضع التأكيد القديم، تم تغيير الحالة من مهملة إلى قديمة. |
الإصدار v14.0.0 | يتم الآن التعامل مع NaN على أنها متطابقة إذا كان كلا الجانبين NaN. |
الإصدار v9.0.0 | تتم الآن مقارنة أسماء ورسائل Error بشكل صحيح. |
الإصدار v8.0.0 | تتم أيضًا مقارنة محتوى Set و Map . |
الإصدار v6.4.0، الإصدار v4.7.1 | يتم الآن التعامل مع شرائح المصفوفة المكتوبة بشكل صحيح. |
الإصدار v6.1.0، الإصدار v4.5.0 | يمكن الآن استخدام الكائنات ذات المراجع الدائرية كمدخلات. |
الإصدار v5.10.1، الإصدار v4.4.3 | التعامل مع المصفوفات المكتوبة غير Uint8Array بشكل صحيح. |
الإصدار v0.1.21 | تمت الإضافة في: الإصدار v0.1.21 |
وضع التأكيد الصارم
اسم مستعار لـ assert.notDeepStrictEqual()
.
وضع التأكيد القديم
[مستقر: 3 - قديم]
مستقر: 3 الاستقرار: 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);
// OK
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.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])
[السجل]
الإصدار | التغييرات |
---|---|
v9.0.0 | لم يعد -0 و +0 يعتبران متساويين. |
v9.0.0 | تتم الآن مقارنة NaN باستخدام مقارنة SameValueZero. |
v9.0.0 | تتم الآن مقارنة أسماء ورسائل Error بشكل صحيح. |
v8.0.0 | تتم أيضًا مقارنة محتوى Set و Map . |
v6.1.0 | يمكن الآن استخدام الكائنات ذات المراجع الدائرية كمدخلات. |
v6.4.0, v4.7.1 | تتم معالجة شرائح المصفوفة المكتوبة بشكل صحيح الآن. |
v5.10.1, v4.4.3 | التعامل مع المصفوفات المكتوبة غير Uint8Array بشكل صحيح. |
v1.2.0 | تمت الإضافة في: v1.2.0 |
يختبر عدم المساواة الدقيقة العميقة. عكس assert.deepStrictEqual()
.
import assert from 'node:assert/strict';
assert.notDeepStrictEqual({ a: 1 }, { a: '1' });
// OK
const assert = require('node:assert/strict');
assert.notDeepStrictEqual({ a: 1 }, { a: '1' });
// OK
إذا كانت القيم متساوية بشكل عميق ودقيق، فسيتم طرح AssertionError
مع تعيين خاصية message
مساوية لقيمة المعامل message
. إذا كان المعامل message
غير معرف، فسيتم تعيين رسالة خطأ افتراضية. إذا كان المعامل message
مثيلاً لـ Error
، فسيتم طرحه بدلاً من AssertionError
.
assert.notEqual(actual, expected[, message])
[السجل]
الإصدار | التغييرات |
---|---|
v16.0.0, v14.18.0 | في وضع تأكيد Legacy، تم تغيير الحالة من Deprecated إلى Legacy. |
v14.0.0 | يتم الآن التعامل مع NaN على أنها متطابقة إذا كان كلا الجانبين NaN. |
v0.1.21 | تمت الإضافة في: v0.1.21 |
وضع التأكيد الدقيق
اسم مستعار لـ assert.notStrictEqual()
.
وضع التأكيد القديم
[مستقر: 3 - قديم]
مستقر: 3 الاستقرار: 3 - قديم: استخدم assert.notStrictEqual()
بدلاً من ذلك.
يختبر عدم المساواة السطحية والقسرية باستخدام !=
operator. تتم معالجة 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])
[السجل]
الإصدار | التغييرات |
---|---|
v10.0.0 | تم تغيير المقارنة المستخدمة من المساواة الصارمة إلى Object.is() . |
v0.1.21 | تمت الإضافة في: v0.1.21 |
تختبر عدم المساواة الصارمة بين المعاملين actual
و expected
كما تحدده Object.is()
.
import assert from 'node:assert/strict';
assert.notStrictEqual(1, 2);
// موافق
assert.notStrictEqual(1, 1);
// AssertionError [ERR_ASSERTION]: المتوقع أن يكون "actual" غير مساوٍ تمامًا لـ:
//
// 1
assert.notStrictEqual(1, '1');
// موافق
const assert = require('node:assert/strict');
assert.notStrictEqual(1, 2);
// موافق
assert.notStrictEqual(1, 1);
// AssertionError [ERR_ASSERTION]: المتوقع أن يكون "actual" غير مساوٍ تمامًا لـ:
//
// 1
assert.notStrictEqual(1, '1');
// موافق
إذا كانت القيم متساوية تمامًا، فسيتم إلقاء AssertionError
مع تعيين خاصية message
تساوي قيمة المعامل message
. إذا كان المعامل message
غير معرف، فسيتم تعيين رسالة خطأ افتراضية. إذا كان المعامل message
نسخة من Error
فسيتم إلقاؤه بدلاً من AssertionError
.
assert.ok(value[, message])
[السجل]
الإصدار | التغييرات |
---|---|
v10.0.0 | ستستخدم assert.ok() (بدون وسائط) الآن رسالة خطأ محددة مسبقًا. |
v0.1.21 | تمت الإضافة في: v0.1.21 |
يختبر ما إذا كانت 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);
// موافق
assert.ok(1);
// موافق
assert.ok();
// AssertionError: لم يتم تمرير وسيطة قيمة إلى `assert.ok()`
assert.ok(false, 'it\'s false');
// AssertionError: إنها خاطئة
// في repl:
assert.ok(typeof 123 === 'string');
// AssertionError: false == true
// في ملف (مثل test.js):
assert.ok(typeof 123 === 'string');
// AssertionError: تم تقييم التعبير إلى قيمة خاطئة:
//
// assert.ok(typeof 123 === 'string')
assert.ok(false);
// AssertionError: تم تقييم التعبير إلى قيمة خاطئة:
//
// assert.ok(false)
assert.ok(0);
// AssertionError: تم تقييم التعبير إلى قيمة خاطئة:
//
// assert.ok(0)
const assert = require('node:assert/strict');
assert.ok(true);
// موافق
assert.ok(1);
// موافق
assert.ok();
// AssertionError: لم يتم تمرير وسيطة قيمة إلى `assert.ok()`
assert.ok(false, 'it\'s false');
// AssertionError: إنها خاطئة
// في repl:
assert.ok(typeof 123 === 'string');
// AssertionError: false == true
// في ملف (مثل test.js):
assert.ok(typeof 123 === 'string');
// AssertionError: تم تقييم التعبير إلى قيمة خاطئة:
//
// assert.ok(typeof 123 === 'string')
assert.ok(false);
// AssertionError: تم تقييم التعبير إلى قيمة خاطئة:
//
// assert.ok(false)
assert.ok(0);
// AssertionError: تم تقييم التعبير إلى قيمة خاطئة:
//
// assert.ok(0)
import assert from 'node:assert/strict';
// استخدام `assert()` يعمل بنفس الطريقة:
assert(0);
// AssertionError: تم تقييم التعبير إلى قيمة خاطئة:
//
// assert(0)
const assert = require('node:assert');
// استخدام `assert()` يعمل بنفس الطريقة:
assert(0);
// AssertionError: تم تقييم التعبير إلى قيمة خاطئة:
//
// assert(0)
assert.rejects(asyncFn[, error][, message])
أُضيف في: v10.0.0
asyncFn
<Function> | <Promise>error
<RegExp> | <Function> | <Object> | <Error>message
<string>
تنتظر الوعد asyncFn
أو، إذا كانت asyncFn
دالة، تستدعي الدالة فورًا وتنتظر الوعد المرتجع ليكتمل. ثم ستتحقق من أن الوعد قد رُفض.
إذا كانت asyncFn
دالة وتطرح خطأ بشكل متزامن، فستعيد assert.rejects()
Promise
مرفوضًا مع هذا الخطأ. إذا لم ترجع الدالة وعدًا، فستعيد assert.rejects()
Promise
مرفوضًا مع خطأ ERR_INVALID_RETURN_VALUE
. في كلتا الحالتين، يتم تخطي معالج الأخطاء.
بالإضافة إلى الطبيعة غير المتزامنة لانتظار الاكتمال، تتصرف بشكل مطابق لـ assert.throws()
.
إذا تم تحديده، يمكن أن يكون error
عبارة عن Class
، أو RegExp
، أو دالة تحقق، أو كائن حيث سيتم اختبار كل خاصية، أو نسخة من خطأ حيث سيتم اختبار كل خاصية بما في ذلك خصائص message
و name
غير القابلة للتعداد.
إذا تم تحديده، ستكون message
هي الرسالة المقدمة من AssertionError
إذا فشلت asyncFn
في الرفض.
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])
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v10.0.0 | تم تغيير المقارنة المستخدمة من المساواة الصارمة إلى Object.is() . |
v0.1.21 | أُضيف في: v0.1.21 |
actual
<أي نوع>expected
<أي نوع>message
<سلسلة نصية> | <خطأ>
يختبر المساواة الصارمة بين المعاملين actual
و expected
كما تحددها Object.is()
.
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);
// موافق
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(1, '1', new TypeError('Inputs are not identical'));
// TypeError: Inputs are not identical
const assert = require('node:assert/strict');
assert.strictEqual(1, 2);
// AssertionError [ERR_ASSERTION]: Expected inputs to be strictly equal:
//
// 1 !== 2
assert.strictEqual(1, 1);
// موافق
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(1, '1', new TypeError('Inputs are not identical'));
// TypeError: Inputs are not identical
إذا لم تكن القيم متساوية تمامًا، يتم إطلاق AssertionError
مع تعيين خاصية message
مساوية لقيمة المعامل message
. إذا كان المعامل message
غير معرف، يتم تعيين رسالة خطأ افتراضية. إذا كان المعامل message
هو نسخة من Error
، فسيتم إطلاقه بدلاً من AssertionError
.
assert.throws(fn[, error][, message])
[سجل التعديلات]
الإصدار | التغييرات |
---|---|
v10.2.0 | يمكن للمعامل error أن يكون كائنًا يحتوي على تعبيرات نمطية الآن. |
v9.9.0 | يمكن للمعامل error الآن أن يكون كائنًا أيضًا. |
v4.2.0 | يمكن للمعامل error الآن أن يكون دالة سهمية. |
v0.1.21 | تمت إضافته في: v0.1.21 |
fn
<Function>error
<RegExp> | <Function> | <Object> | <Error>message
<string>
تتوقع أن تقوم الدالة fn
بإلقاء خطأ.
إذا تم تحديد error
، فيمكن أن تكون Class
أو RegExp
أو دالة تحقق أو كائن تحقق حيث سيتم اختبار كل خاصية فيه للتأكد من المساواة العميقة الصارمة أو نسخة من خطأ حيث سيتم اختبار كل خاصية فيه للتأكد من المساواة العميقة الصارمة بما في ذلك الخصائص غير القابلة للتعداد message
و name
. عند استخدام كائن، من الممكن أيضًا استخدام تعبير نمطي، عند التحقق من صحة خاصية السلسلة. انظر أدناه للحصول على أمثلة.
إذا تم تحديد message
، فسيتم إلحاقها بالرسالة المقدمة من AssertionError
إذا فشل استدعاء fn
في الإلقاء أو في حالة فشل التحقق من صحة الخطأ.
نموذج لكائن/نموذج خطأ للتحقق المخصص:
import assert from 'node:assert/strict';
const err = new TypeError('قيمة خاطئة');
err.code = 404;
err.foo = 'bar';
err.info = {
nested: true,
baz: 'text',
};
err.reg = /abc/i;
assert.throws(
() => {
throw err;
},
{
name: 'TypeError',
message: 'قيمة خاطئة',
info: {
nested: true,
baz: 'text',
},
// سيتم اختبار الخصائص الموجودة في كائن التحقق فقط.
// يتطلب استخدام الكائنات المتداخلة وجود جميع الخصائص. وإلا
// فسيفشل التحقق.
},
);
// استخدام التعبيرات النمطية للتحقق من خصائص الخطأ:
assert.throws(
() => {
throw err;
},
{
// الخاصيتان `name` و `message` عبارة عن سلاسل نصية وسيتم استخدام التعبيرات النمطية
// الموجودة عليها للمطابقة مع السلسلة النصية. إذا فشلت، فسيتم إلقاء
// خطأ.
name: /^TypeError$/,
message: /Wrong/,
foo: 'bar',
info: {
nested: true,
// لا يمكن استخدام التعبيرات النمطية للخصائص المتداخلة!
baz: 'text',
},
// تحتوي الخاصية `reg` على تعبير نمطي وفقط إذا كان
// يحتوي كائن التحقق على تعبير نمطي مطابق، فسوف
// ينجح.
reg: /abc/i,
},
);
// يفشل بسبب اختلال خصائص `message` و `name`:
assert.throws(
() => {
const otherErr = new Error('غير موجود');
// انسخ جميع الخصائص القابلة للتعداد من `err` إلى `otherErr`.
for (const [key, value] of Object.entries(err)) {
otherErr[key] = value;
}
throw otherErr;
},
// سيتم أيضًا التحقق من خصائص `message` و `name` الخاصة بالخطأ عند استخدام
// خطأ ككائن تحقق.
err,
);
const assert = require('node:assert/strict');
const err = new TypeError('قيمة خاطئة');
err.code = 404;
err.foo = 'bar';
err.info = {
nested: true,
baz: 'text',
};
err.reg = /abc/i;
assert.throws(
() => {
throw err;
},
{
name: 'TypeError',
message: 'قيمة خاطئة',
info: {
nested: true,
baz: 'text',
},
// سيتم اختبار الخصائص الموجودة في كائن التحقق فقط.
// يتطلب استخدام الكائنات المتداخلة وجود جميع الخصائص. وإلا
// فسيفشل التحقق.
},
);
// استخدام التعبيرات النمطية للتحقق من خصائص الخطأ:
assert.throws(
() => {
throw err;
},
{
// الخاصيتان `name` و `message` عبارة عن سلاسل نصية وسيتم استخدام التعبيرات النمطية
// الموجودة عليها للمطابقة مع السلسلة النصية. إذا فشلت، فسيتم إلقاء
// خطأ.
name: /^TypeError$/,
message: /Wrong/,
foo: 'bar',
info: {
nested: true,
// لا يمكن استخدام التعبيرات النمطية للخصائص المتداخلة!
baz: 'text',
},
// تحتوي الخاصية `reg` على تعبير نمطي وفقط إذا كان
// يحتوي كائن التحقق على تعبير نمطي مطابق، فسوف
// ينجح.
reg: /abc/i,
},
);
// يفشل بسبب اختلال خصائص `message` و `name`:
assert.throws(
() => {
const otherErr = new Error('غير موجود');
// انسخ جميع الخصائص القابلة للتعداد من `err` إلى `otherErr`.
for (const [key, value] of Object.entries(err)) {
otherErr[key] = value;
}
throw otherErr;
},
// سيتم أيضًا التحقق من خصائص `message` و `name` الخاصة بالخطأ عند استخدام
// خطأ ككائن تحقق.
err,
);
تحقق من instanceof باستخدام المُنشئ:
import assert from 'node:assert/strict';
assert.throws(
() => {
throw new Error('قيمة خاطئة');
},
Error,
);
const assert = require('node:assert/strict');
assert.throws(
() => {
throw new Error('قيمة خاطئة');
},
Error,
);
تحقق من رسالة الخطأ باستخدام RegExp
:
سيؤدي استخدام تعبير نمطي إلى تشغيل .toString
على كائن الخطأ، وبالتالي سيشمل أيضًا اسم الخطأ.
import assert from 'node:assert/strict';
assert.throws(
() => {
throw new Error('قيمة خاطئة');
},
/^Error: Wrong value$/,
);
const assert = require('node:assert/strict');
assert.throws(
() => {
throw new Error('قيمة خاطئة');
},
/^Error: Wrong value$/,
);
التحقق من صحة الخطأ المخصص:
يجب أن تُرجع الدالة true
للإشارة إلى نجاح جميع عمليات التحقق الداخلية. وإلا فسوف تفشل مع AssertionError
.
import assert from 'node:assert/strict';
assert.throws(
() => {
throw new Error('قيمة خاطئة');
},
(err) => {
assert(err instanceof Error);
assert(/value/.test(err));
// تجنب إرجاع أي شيء من وظائف التحقق بخلاف `true`.
// خلاف ذلك، ليس من الواضح أي جزء من التحقق فشل. بدلاً من ذلك،
// ألقِ خطأً بشأن التحقق المحدد الذي فشل (كما هو موضح في هذا
// المثال) وأضف أكبر قدر ممكن من معلومات التصحيح المفيدة إلى هذا الخطأ
// ممكن.
return true;
},
'خطأ غير متوقع',
);
const assert = require('node:assert/strict');
assert.throws(
() => {
throw new Error('قيمة خاطئة');
},
(err) => {
assert(err instanceof Error);
assert(/value/.test(err));
// تجنب إرجاع أي شيء من وظائف التحقق بخلاف `true`.
// خلاف ذلك، ليس من الواضح أي جزء من التحقق فشل. بدلاً من ذلك،
// ألقِ خطأً بشأن التحقق المحدد الذي فشل (كما هو موضح في هذا
// المثال) وأضف أكبر قدر ممكن من معلومات التصحيح المفيدة إلى هذا الخطأ
// ممكن.
return true;
},
'خطأ غير متوقع',
);
لا يمكن أن يكون error
سلسلة. إذا تم توفير سلسلة كوسيطة ثانية، فسيتم افتراض حذف error
وسيتم استخدام السلسلة لـ message
بدلاً من ذلك. يمكن أن يؤدي هذا إلى أخطاء سهلة الفقدان. سيؤدي استخدام نفس الرسالة مثل رسالة الخطأ التي تم إلقاؤها إلى حدوث خطأ ERR_AMBIGUOUS_ARGUMENT
. يرجى قراءة المثال أدناه بعناية إذا تم اعتبار استخدام سلسلة كوسيطة ثانية:
import assert from 'node:assert/strict';
function throwingFirst() {
throw new Error('الأول');
}
function throwingSecond() {
throw new Error('الثاني');
}
function notThrowing() {}
// الوسيطة الثانية عبارة عن سلسلة والدالة المدخلة ألقت خطأً.
// لن يتم إلقاء الحالة الأولى لأنها لا تتطابق مع رسالة الخطأ
// التي ألقتها الدالة المدخلة!
assert.throws(throwingFirst, 'الثاني');
// في المثال التالي، لا توجد فائدة للرسالة على رسالة
// الخطأ، ونظرًا لأنه ليس من الواضح ما إذا كان المستخدم ينوي بالفعل المطابقة
// مع رسالة الخطأ، فإن Node.js يلقي خطأ `ERR_AMBIGUOUS_ARGUMENT`.
assert.throws(throwingSecond, 'الثاني');
// TypeError [ERR_AMBIGUOUS_ARGUMENT]
// يتم استخدام السلسلة فقط (كرسالة) في حالة عدم إلقاء الدالة:
assert.throws(notThrowing, 'الثاني');
// AssertionError [ERR_ASSERTION]: الاستثناء المتوقع مفقود: الثاني
// إذا كان المقصود هو المطابقة مع رسالة الخطأ، فافعل هذا بدلاً من ذلك:
// لا يتم إلقاؤه لأن رسائل الخطأ متطابقة.
assert.throws(throwingSecond, /Second$/);
// إذا كانت رسالة الخطأ غير متطابقة، فسيتم إلقاء AssertionError.
assert.throws(throwingFirst, /Second$/);
// AssertionError [ERR_ASSERTION]
const assert = require('node:assert/strict');
function throwingFirst() {
throw new Error('الأول');
}
function throwingSecond() {
throw new Error('الثاني');
}
function notThrowing() {}
// الوسيطة الثانية عبارة عن سلسلة والدالة المدخلة ألقت خطأً.
// لن يتم إلقاء الحالة الأولى لأنها لا تتطابق مع رسالة الخطأ
// التي ألقتها الدالة المدخلة!
assert.throws(throwingFirst, 'الثاني');
// في المثال التالي، لا توجد فائدة للرسالة على رسالة
// الخطأ، ونظرًا لأنه ليس من الواضح ما إذا كان المستخدم ينوي بالفعل المطابقة
// مع رسالة الخطأ، فإن Node.js يلقي خطأ `ERR_AMBIGUOUS_ARGUMENT`.
assert.throws(throwingSecond, 'الثاني');
// TypeError [ERR_AMBIGUOUS_ARGUMENT]
// يتم استخدام السلسلة فقط (كرسالة) في حالة عدم إلقاء الدالة:
assert.throws(notThrowing, 'الثاني');
// AssertionError [ERR_ASSERTION]: الاستثناء المتوقع مفقود: الثاني
// إذا كان المقصود هو المطابقة مع رسالة الخطأ، فافعل هذا بدلاً من ذلك:
// لا يتم إلقاؤه لأن رسائل الخطأ متطابقة.
assert.throws(throwingSecond, /Second$/);
// إذا كانت رسالة الخطأ غير متطابقة، فسيتم إلقاء AssertionError.
assert.throws(throwingFirst, /Second$/);
// AssertionError [ERR_ASSERTION]
نظرًا للتدوين المربك والمعرض للخطأ، تجنب استخدام سلسلة كوسيطة ثانية.
assert.partialDeepStrictEqual(actual, expected[, message])
أُضيف في: الإصدار v23.4.0
assert.partialDeepStrictEqual()
تؤكد التكافؤ بين المعاملين actual
و expected
من خلال مقارنة عميقة، مع ضمان وجود جميع الخصائص الموجودة في المعامل expected
في المعامل actual
بقيم مكافئة، وعدم السماح بالإكراه على النوع. والفرق الرئيسي مع assert.deepStrictEqual()
هو أن assert.partialDeepStrictEqual()
لا تتطلب وجود جميع الخصائص الموجودة في المعامل actual
في المعامل expected
. يجب أن تجتاز هذه الطريقة دائمًا نفس حالات الاختبار مثل assert.deepStrictEqual()
، وتتصرف كمجموعة فائقة منها.
import assert from 'node:assert';
assert.partialDeepStrictEqual({ a: 1, b: 2 }, { a: 1, b: 2 });
// OK
assert.partialDeepStrictEqual({ a: { b: { c: 1 } } }, { a: { b: { c: 1 } } });
// OK
assert.partialDeepStrictEqual({ a: 1, b: 2, c: 3 }, { a: 1, b: 2 });
// OK
assert.partialDeepStrictEqual(new Set(['value1', 'value2']), new Set(['value1', 'value2']));
// OK
assert.partialDeepStrictEqual(new Map([['key1', 'value1']]), new Map([['key1', 'value1']]));
// OK
assert.partialDeepStrictEqual(new Uint8Array([1, 2, 3]), new Uint8Array([1, 2, 3]));
// OK
assert.partialDeepStrictEqual(/abc/, /abc/);
// OK
assert.partialDeepStrictEqual([{ a: 5 }, { b: 5 }], [{ a: 5 }]);
// OK
assert.partialDeepStrictEqual(new Set([{ a: 1 }, { b: 1 }]), new Set([{ a: 1 }]));
// OK
assert.partialDeepStrictEqual(new Date(0), new Date(0));
// OK
assert.partialDeepStrictEqual({ a: 1 }, { a: 1, b: 2 });
// AssertionError
assert.partialDeepStrictEqual({ a: 1, b: '2' }, { a: 1, b: 2 });
// AssertionError
assert.partialDeepStrictEqual({ a: { b: 2 } }, { a: { b: '2' } });
// AssertionError
const assert = require('node:assert');
assert.partialDeepStrictEqual({ a: 1, b: 2 }, { a: 1, b: 2 });
// OK
assert.partialDeepStrictEqual({ a: { b: { c: 1 } } }, { a: { b: { c: 1 } } });
// OK
assert.partialDeepStrictEqual({ a: 1, b: 2, c: 3 }, { a: 1, b: 2 });
// OK
assert.partialDeepStrictEqual([{ a: 5 }, { b: 5 }], [{ a: 5 }]);
// OK
assert.partialDeepStrictEqual(new Set([{ a: 1 }, { b: 1 }]), new Set([{ a: 1 }]));
// OK
assert.partialDeepStrictEqual({ a: 1 }, { a: 1, b: 2 });
// AssertionError
assert.partialDeepStrictEqual({ a: 1, b: '2' }, { a: 1, b: 2 });
// AssertionError
assert.partialDeepStrictEqual({ a: { b: 2 } }, { a: { b: '2' } });
// AssertionError