التأكيد (Assert)
[مستقر: 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 |
هذه الميزة مُهملة وسيتم إزالتها في إصدار مستقبلي. يُرجى النظر في استخدام بدائل مثل دالة المُساعدة 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 <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')
// إنشاء متتبع المكالمات.
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 <Object>
المصفوفات تحتوي على معلومات حول العدد المتوقع والفعلي لاستدعاءات الدوال التي لم يتم استدعائها بالعدد المتوقع من المرات.
import assert from 'node:assert'
// إنشاء متتبع المكالمات.
const tracker = new assert.CallTracker()
function func() {}
// ترجع دالة تُغلِّف func() والتي يجب استدعائها عددًا دقيقًا من المرات قبل tracker.verify().
const callsfunc = tracker.calls(func, 2)
// ترجع مصفوفة تحتوي على معلومات حول 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')
// إنشاء متتبع المكالمات.
const tracker = new assert.CallTracker()
function func() {}
// ترجع دالة تُغلِّف func() والتي يجب استدعائها عددًا دقيقًا من المرات قبل tracker.verify().
const callsfunc = tracker.calls(func, 2)
// ترجع مصفوفة تحتوي على معلومات حول 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 | يتم الآن مقارنة سبب الخطأ وخصائص الأخطاء أيضًا. |
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 و flags و source لـ
RegExp
، حتى لو لم تكن هذه خصائص قابلة للعد.
لا يُلقي المثال التالي خطأ AssertionError
لأن القيم البدائية تُقارَن باستخدام عامل التشغيل ==
.
import assert from 'node:assert'
// تحذير: هذا لا يُلقي خطأ AssertionError!
assert.deepEqual('+00000000', false)
const assert = require('node:assert')
// تحذير: هذا لا يُلقي خطأ 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)
// حسنًا
// قيم b مختلفة:
assert.deepEqual(obj1, obj2)
// AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } }
assert.deepEqual(obj1, obj3)
// حسنًا
// يتم تجاهل النماذج الأولية:
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)
// حسنًا
// قيم b مختلفة:
assert.deepEqual(obj1, obj2)
// AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } }
assert.deepEqual(obj1, obj3)
// حسنًا
// يتم تجاهل النماذج الأولية:
assert.deepEqual(obj1, obj4)
// AssertionError: { a: { b: 1 } } deepEqual {}
إذا لم تكن القيم متساوية، فسيتم إلقاء خطأ AssertionError
مع خاصية message
مُعيّنة تساوي قيمة معلمة message
. إذا كانت معلمة message
غير مُعرّفة، فسيتم تعيين رسالة خطأ افتراضية. إذا كانت معلمة message
مثيلًا لخطأ Error
، فسيتم إلقاؤه بدلاً من خطأ AssertionError
.
assert.deepStrictEqual(actual, expected[, message])
[History]
الإصدار | التغييرات |
---|---|
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
على قيمها. انظر أدناه لمزيد من التفاصيل. - يتم دائمًا مقارنة lastIndex و flags و source لـ
RegExp
، حتى لو لم تكن هذه خصائص قابلة للعد.
import assert from 'node:assert/strict'
// هذا يفشل لأن 1 !== '1'.
assert.deepStrictEqual({ a: 1 }, { a: '1' })
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// {
// + a: 1
// - a: '1'
// }
// الكائنات التالية ليس لديها خصائص خاصة
const date = new Date()
const object = {}
const fakeDate = {}
Object.setPrototypeOf(fakeDate, Date.prototype)
// [[Prototype]] مختلفة:
assert.deepStrictEqual(object, fakeDate)
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// + {}
// - Date {}
// علامات نوع مختلفة:
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)
// موافق لأن Object.is(NaN, NaN) صحيح.
// أرقام مفككة مختلفة:
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'))
// موافق لأن الكائن والسلسلة متطابقان عند فك التغليف.
assert.deepStrictEqual(-0, -0)
// موافق
// أصفار مختلفة:
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 })
// موافق، لأنه نفس الرمز في كلا الكائنين.
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)
// موافق، لأنه من المستحيل مقارنة الإدخالات
// يفشل لأن weakMap3 لديه خاصية لا تحتوي عليها weakMap1:
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')
// هذا يفشل لأن 1 !== '1'.
assert.deepStrictEqual({ a: 1 }, { a: '1' })
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// {
// + a: 1
// - a: '1'
// }
// الكائنات التالية ليس لديها خصائص خاصة
const date = new Date()
const object = {}
const fakeDate = {}
Object.setPrototypeOf(fakeDate, Date.prototype)
// [[Prototype]] مختلفة:
assert.deepStrictEqual(object, fakeDate)
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// + {}
// - Date {}
// علامات نوع مختلفة:
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)
// موافق لأن Object.is(NaN, NaN) صحيح.
// أرقام مفككة مختلفة:
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'))
// موافق لأن الكائن والسلسلة متطابقان عند فك التغليف.
assert.deepStrictEqual(-0, -0)
// موافق
// أصفار مختلفة:
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 })
// موافق، لأنه نفس الرمز في كلا الكائنين.
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)
// موافق، لأنه من المستحيل مقارنة الإدخالات
// يفشل لأن weakMap3 لديه خاصية لا تحتوي عليها weakMap1:
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])
[History]
الإصدار | التغييرات |
---|---|
v16.0.0 | لم يعد هذا API تجريبيًا. |
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]: 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
const 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
من نوع آخر غير 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()
وعدًا مُرفوضًا بهذا الخطأ. إذا لم تُرجع الدالة وعدًا، فسوف تُرجع assert.doesNotReject()
وعدًا مُرفوضًا بخطأ 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])
[History]
الإصدار | التغييرات |
---|---|
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
مع رسالة "تم الحصول على استثناء غير مرغوب فيه...":
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)
// موافق، 1 == 1
assert.equal(1, '1')
// موافق، 1 == '1'
assert.equal(NaN, NaN)
// موافق
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)
// موافق، 1 == 1
assert.equal(1, '1')
// موافق، 1 == '1'
assert.equal(NaN, NaN)
// موافق
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]]])
[History]
الإصدار | التغييرات |
---|---|
v10.0.0 | أصبح استدعاء assert.fail() بأكثر من حجة واحد مُحذّر منه ويصدر تحذيرًا. |
v0.1.21 | مضاف في: v0.1.21 |
[Stable: 0 - Deprecated]
Stable: 0 Stability: 0 - مُحذّر منه: استخدم assert.fail([message])
أو دوال التأكيد الأخرى بدلاً من ذلك.
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)
[History]
الإصدار | التغييرات |
---|---|
v10.0.0 | بدلاً من رمي الخطأ الأصلي، يتم الآن تضمينه في [AssertionError ][] والذي يحتوي على تتبع كامل للمكدس. |
v10.0.0 | قيمة value قد تكون الآن فقط undefined أو null . قبل ذلك، تم التعامل مع جميع القيم الخاطئة بنفس طريقة null ولم يتم رميها. |
v0.1.97 | تمت الإضافة في: v0.1.97 |
value
<أي>
يقوم برمي value
إذا لم تكن value
undefined
أو null
. هذا مفيد عند اختبار وسيطة error
في الردود العكسية. يحتوي تتبع المكدس على جميع الإطارات من الخطأ الممرر إلى ifError()
بما في ذلك الإطارات الجديدة المحتملة لـ ifError()
نفسها.
import assert from 'node:assert/strict'
assert.ifError(null)
// موافق
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)
// موافق
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])
[History]
الإصدار | التغييرات |
---|---|
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])
[History]
الإصدار | التغييرات |
---|---|
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()
.
وضع التأكيد القديم
[Stable: 3 - Legacy]
Stable: 3 Stability: 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])
[History]
الإصدار | التغييرات |
---|---|
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' })
// موافق
const assert = require('node:assert/strict')
assert.notDeepStrictEqual({ a: 1 }, { a: '1' })
// موافق
إذا كانت القيم متساوية بشكل عميق وصارم، فسيتم طرح AssertionError
مع خاصية message
مُعيّنة مساوية لقيمة وسيطة message
. إذا كانت وسيطة message
غير مُعرّفة، فسيتم تعيين رسالة خطأ افتراضية. إذا كانت وسيطة message
مثيلًا لـ Error
، فسيتم طرحها بدلاً من AssertionError
.
assert.notEqual(actual, expected[, message])
[History]
الإصدار | التغييرات |
---|---|
v16.0.0, v14.18.0 | في وضع التأكيد القديم، تم تغيير الحالة من مُهملة إلى قديمة. |
v14.0.0 | يتم الآن التعامل مع NaN على أنها متطابقة إذا كان كلا الجانبين NaN. |
v0.1.21 | تمت الإضافة في: v0.1.21 |
وضع التأكيد الصارم
اسم آخر لـ assert.notStrictEqual()
.
وضع التأكيد القديم
[Stable: 3 - Legacy]
Stable: 3 Stability: 3 - قديم: استخدم assert.notStrictEqual()
بدلاً من ذلك.
اختبار عدم المساواة السطحي، القسري مع عامل التشغيل !=
. يتم التعامل مع NaN بشكل خاص ويتم اعتبارها متطابقة إذا كان كلا الجانبين NaN.
import assert from 'node:assert'
assert.notEqual(1, 2)
// موافق
assert.notEqual(1, 1)
// AssertionError: 1 != 1
assert.notEqual(1, '1')
// AssertionError: 1 != '1'
const assert = require('node:assert')
assert.notEqual(1, 2)
// موافق
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])
[History]
الإصدار | التغييرات |
---|---|
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)
// OK
assert.notStrictEqual(1, 1)
// AssertionError [ERR_ASSERTION]: Expected "actual" to be strictly unequal to:
//
// 1
assert.notStrictEqual(1, '1')
// OK
const 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])
[History]
الإصدار | التغييرات |
---|---|
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)
// 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(0)
// AssertionError: The expression evaluated to a falsy value:
//
// assert(0)
const assert = require('node:assert')
// Using `assert()` works the same:
assert(0)
// AssertionError: The expression evaluated to a falsy value:
//
// 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()
ستُعيد وعدًا مُرفوضًا مع ذلك الخطأ. إذا لم تُرجع الدالة وعدًا، فإن assert.rejects()
ستُعيد وعدًا مُرفوضًا مع خطأ 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])
[History]
الإصدار | التغييرات |
---|---|
v10.0.0 | تغيرت المقارنة المستخدمة من المساواة الصارمة إلى Object.is() . |
v0.1.21 | تمت الإضافة في: v0.1.21 |
يختبر المساواة الصارمة بين المعلمتين 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)
// 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(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)
// 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(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
بإلقاء خطأ.
إذا تم تحديده، يمكن أن يكون error
عبارة عن فئة
، أو تعبيرات عادية
، أو دالة للتحقق من الصحة، أو كائن للتحقق من الصحة حيث سيتم اختبار كل خاصية من أجل المساواة العميقة الصارمة، أو مثيل خطأ حيث سيتم اختبار كل خاصية من أجل المساواة العميقة الصارمة بما في ذلك خصائص message
و name
غير القابلة للعد. عند استخدام كائن، من الممكن أيضًا استخدام تعبير عادي عند التحقق من صحة خاصية السلسلة. انظر الأمثلة أدناه.
إذا تم تحديده، سيتم إضافة message
إلى الرسالة المقدمة بواسطة AssertionError
إذا فشلت fn
في الإلقاء أو في حالة فشل التحقق من صحة الخطأ.
مثال كائن/مثيل خطأ مخصص للتحقق من الصحة:
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',
},
// سيتم اختبار الخصائص الموجودة في كائن التحقق من الصحة فقط.
// يتطلب استخدام الكائنات المتداخلة وجود جميع الخصائص. خلاف ذلك،
// سيحدث فشل في التحقق من الصحة.
}
)
// استخدام التعبيرات العادية للتحقق من صحة خصائص الخطأ:
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('Not found')
// نسخ جميع الخصائص القابلة للعد من `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('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',
},
// سيتم اختبار الخصائص الموجودة في كائن التحقق من الصحة فقط.
// يتطلب استخدام الكائنات المتداخلة وجود جميع الخصائص. خلاف ذلك،
// سيحدث فشل في التحقق من الصحة.
}
)
// استخدام التعبيرات العادية للتحقق من صحة خصائص الخطأ:
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('Not found')
// نسخ جميع الخصائص القابلة للعد من `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('Wrong value')
}, Error)
const assert = require('node:assert/strict')
assert.throws(() => {
throw new Error('Wrong value')
}, Error)
التحقق من رسالة الخطأ باستخدام تعبيرات عادية
:
يقوم استخدام تعبير عادي بتشغيل .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))
// تجنب إرجاع أي شيء من دوال التحقق من الصحة بالإضافة إلى `true`.
// خلاف ذلك، ليس من الواضح أي جزء من عملية التحقق من الصحة فشل. بدلاً من ذلك،
// ألقِ خطأً حول التحقق من الصحة الذي فشل (كما هو موضح في هذا
// المثال) وأضف أكبر قدر ممكن من معلومات التصحيح المفيدة إلى هذا الخطأ
// قدر الإمكان.
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))
// تجنب إرجاع أي شيء من دوال التحقق من الصحة بالإضافة إلى `true`.
// خلاف ذلك، ليس من الواضح أي جزء من عملية التحقق من الصحة فشل. بدلاً من ذلك،
// ألقِ خطأً حول التحقق من الصحة الذي فشل (كما هو موضح في هذا
// المثال) وأضف أكبر قدر ممكن من معلومات التصحيح المفيدة إلى هذا الخطأ
// قدر الإمكان.
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() {}
// الحجة الثانية هي سلسلة والدالة المدخلة ألقَت خطأ.
// الحالة الأولى لن تُلقي خطأ لأنها لا تتطابق مع رسالة الخطأ
// التي ألقَتها الدالة المدخلة!
assert.throws(throwingFirst, 'Second')
// في المثال التالي، لا تفيد الرسالة أكثر من رسالة الخطأ، وبما أنه ليس من الواضح ما إذا كان المستخدم يعتزم بالفعل المطابقة
// ضد رسالة الخطأ، فإن Node.js يُلقي خطأً `ERR_AMBIGUOUS_ARGUMENT`.
assert.throws(throwingSecond, 'Second')
// TypeError [ERR_AMBIGUOUS_ARGUMENT]
// يتم استخدام السلسلة فقط (كرسالة) في حالة عدم إلقاء الدالة خطأ:
assert.throws(notThrowing, 'Second')
// AssertionError [ERR_ASSERTION]: Missing expected exception: Second
// إذا كان من المقصود مطابقة رسالة الخطأ، فافعل هذا بدلاً من ذلك:
// لا تُلقي خطأ لأن رسائل الخطأ تتطابق.
assert.throws(throwingSecond, /Second$/)
// إذا لم تتطابق رسالة الخطأ، فسيتم إلقاء AssertionError.
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() {}
// الحجة الثانية هي سلسلة والدالة المدخلة ألقَت خطأ.
// الحالة الأولى لن تُلقي خطأ لأنها لا تتطابق مع رسالة الخطأ
// التي ألقَتها الدالة المدخلة!
assert.throws(throwingFirst, 'Second')
// في المثال التالي، لا تفيد الرسالة أكثر من رسالة الخطأ، وبما أنه ليس من الواضح ما إذا كان المستخدم يعتزم بالفعل المطابقة
// ضد رسالة الخطأ، فإن Node.js يُلقي خطأً `ERR_AMBIGUOUS_ARGUMENT`.
assert.throws(throwingSecond, 'Second')
// TypeError [ERR_AMBIGUOUS_ARGUMENT]
// يتم استخدام السلسلة فقط (كرسالة) في حالة عدم إلقاء الدالة خطأ:
assert.throws(notThrowing, 'Second')
// AssertionError [ERR_ASSERTION]: Missing expected exception: Second
// إذا كان من المقصود مطابقة رسالة الخطأ، فافعل هذا بدلاً من ذلك:
// لا تُلقي خطأ لأن رسائل الخطأ تتطابق.
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 })
// موافق
assert.partialDeepStrictEqual({ a: { b: { c: 1 } } }, { a: { b: { c: 1 } } })
// موافق
assert.partialDeepStrictEqual({ a: 1, b: 2, c: 3 }, { a: 1, b: 2 })
// موافق
assert.partialDeepStrictEqual(new Set(['value1', 'value2']), new Set(['value1', 'value2']))
// موافق
assert.partialDeepStrictEqual(new Map([['key1', 'value1']]), new Map([['key1', 'value1']]))
// موافق
assert.partialDeepStrictEqual(new Uint8Array([1, 2, 3]), new Uint8Array([1, 2, 3]))
// موافق
assert.partialDeepStrictEqual(/abc/, /abc/)
// موافق
assert.partialDeepStrictEqual([{ a: 5 }, { b: 5 }], [{ a: 5 }])
// موافق
assert.partialDeepStrictEqual(new Set([{ a: 1 }, { b: 1 }]), new Set([{ a: 1 }]))
// موافق
assert.partialDeepStrictEqual(new Date(0), new Date(0))
// موافق
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 })
// موافق
assert.partialDeepStrictEqual({ a: { b: { c: 1 } } }, { a: { b: { c: 1 } } })
// موافق
assert.partialDeepStrictEqual({ a: 1, b: 2, c: 3 }, { a: 1, b: 2 })
// موافق
assert.partialDeepStrictEqual([{ a: 5 }, { b: 5 }], [{ a: 5 }])
// موافق
assert.partialDeepStrictEqual(new Set([{ a: 1 }, { b: 1 }]), new Set([{ a: 1 }]))
// موافق
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