Skip to content

التأكيد (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().

في وضع التأكيد الصارم، تعرض رسائل خطأ الكائنات اختلافًا. في وضع التأكيد القديم، تعرض رسائل خطأ الكائنات الكائنات، وغالبًا ما تكون مقصوصة.

لاستخدام وضع التأكيد الصارم:

js
import { strict as assert } from 'node:assert'
js
const assert = require('node:assert').strict
js
import assert from 'node:assert/strict'
js
const assert = require('node:assert/strict')

مثال على اختلاف الخطأ:

js
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
//   ]
js
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().

وضع التأكيد القديم

يستخدم وضع التأكيد القديم عامل التشغيل == في:

لاستخدام وضع التأكيد القديم:

js
import assert from 'node:assert'
js
const assert = require('node:assert')

قد يكون لوضع التأكيد القديم نتائج مفاجئة، خاصة عند استخدام assert.deepEqual():

js
// تحذير: هذا لا يرمي خطأ AssertionError في وضع التأكيد القديم!
assert.deepEqual(/a/gi, new Date())

الصنف: assert.AssertionError

يشير إلى فشل التأكيد. ستكون جميع الأخطاء التي يرميها الوحدة النمطية 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> مُعيّن إلى قيمة العامل المُمرّرة.
js
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)
}
js
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').

js
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()
})
js
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() سيرمي خطأ.

js
import assert from 'node:assert'

// يُنشئ مُتتبع الاستدعاءات.
const tracker = new assert.CallTracker()

function func() {}

// يُرجع دالة تُغلف func() ويجب استدعاءها عددًا دقيقًا من المرات قبل tracker.verify().
const callsfunc = tracker.calls(func)
js
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>
    • thisArg <Object>
    • arguments <Array> الوسائط المُمرَّرة إلى الدالة المُتَبَعَّة
js
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] }])
js
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>
    • message <string>
    • actual <number> العدد الفعلي لعدد مرات استدعاء الدالة.
    • expected <number> عدد مرات استدعاء الدالة المتوقعة.
    • operator <string> اسم الدالة المُغلَّفة.
    • stack <Object> تتبع مُكدس للدالة.

المصفوفات تحتوي على معلومات حول العدد المتوقع والفعلي لاستدعاءات الدوال التي لم يتم استدعائها بالعدد المتوقع من المرات.

js
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
//  }
// ]
js
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> دالة مُتَبَعة لإعادة الضبط.

إعادة ضبط مكالمات مُتَبِّع المكالمات. إذا تم تمرير دالة مُتَبَعة كوسيط، فسيتم إعادة ضبط المكالمات لها. إذا لم يتم تمرير أي وسيط، فسيتم إعادة ضبط جميع الدوال المُتَبَعة.

js
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)
js
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() وسيطرح خطأً للدوال التي لم يتم استدعاءها بالعدد المتوقع من المرات.

js
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()
js
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 لأن القيم البدائية تُقارَن باستخدام عامل التشغيل ==.

js
import assert from 'node:assert'
// تحذير: هذا لا يُلقي خطأ AssertionError!

assert.deepEqual('+00000000', false)
js
const assert = require('node:assert')
// تحذير: هذا لا يُلقي خطأ AssertionError!

assert.deepEqual('+00000000', false)

تعني المساواة "العميقة" أن خصائص "الخاصة" القابلة للعد لكائنات الطفل تُقيَّم أيضًا:

js
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 {}
js
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، حتى لو لم تكن هذه خصائص قابلة للعد.
js
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
//   }
js
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 التعبير العادي.

js
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
js
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، أو إذا كانت asyncFn دالة، فإنه يتصل بالدالة على الفور وينتظر اكتمال الوعد المُرجع. ثم سيتحقق من عدم رفض الوعد.

إذا كانت asyncFn دالة ورمت خطأ بشكل متزامن، فسوف تُرجع assert.doesNotReject() وعدًا مُرفوضًا بهذا الخطأ. إذا لم تُرجع الدالة وعدًا، فسوف تُرجع assert.doesNotReject() وعدًا مُرفوضًا بخطأ ERR_INVALID_RETURN_VALUE. في كلتا الحالتين، يتم تخطي مُعالِج الأخطاء.

في الواقع، ليس استخدام assert.doesNotReject() مفيدًا لأنه لا توجد فائدة تُذكر في التقاط رفض ثم رفضه مرة أخرى. بدلاً من ذلك، ضع في اعتبارك إضافة تعليق بجانب مسار الكود المحدد الذي يجب ألا يُرفض، واحتفظ برسائل الخطأ بأكثر قدر ممكن من الوضوح.

إذا تم تحديده، يمكن أن يكون error عبارة عن Class، أو RegExp، أو دالة تحقق. راجع assert.throws() لمزيد من التفاصيل.

إلى جانب الطبيعة غير المتزامنة لانتظار الإكمال، فإنها تتصرف بشكل مطابق لـ assert.doesNotThrow().

js
import assert from 'node:assert/strict'

await assert.doesNotReject(async () => {
  throw new TypeError('Wrong value')
}, SyntaxError)
js
const assert = require('node:assert/strict')

;(async () => {
  await assert.doesNotReject(async () => {
    throw new TypeError('Wrong value')
  }, SyntaxError)
})()
js
import assert from 'node:assert/strict'

assert.doesNotReject(Promise.reject(new TypeError('Wrong value'))).then(() => {
  // ...
})
js
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 لا تطلق خطأ.

في الواقع، استخدام assert.doesNotThrow() ليس مفيدًا لأنه لا توجد فائدة في التقاط خطأ ثم إعادة إطلاقه. بدلاً من ذلك، ضع في اعتبارك إضافة تعليق بجانب مسار التعليمات البرمجية المحدد الذي لا يجب أن يُطلق خطأً والحفاظ على رسائل الخطأ بأكثر قدر ممكن من الوضوح.

عندما يتم استدعاء assert.doesNotThrow()، فإنه سيتصل على الفور بدالة fn.

إذا تم إطلاق خطأ وهو من نفس النوع الذي حددته معلمة error، فسيتم إطلاق AssertionError. إذا كان الخطأ من نوع مختلف، أو إذا كانت معلمة error غير معرفة، فسيتم نشر الخطأ مرة أخرى إلى المُستدعي.

إذا تم تحديده، يمكن أن يكون error عبارة عن Class، أو RegExp، أو دالة التحقق. راجع assert.throws() لمزيد من التفاصيل.

على سبيل المثال، ما يلي سيرمي TypeError لأنه لا يوجد نوع خطأ مطابق في التأكيد:

js
import assert from 'node:assert/strict'

assert.doesNotThrow(() => {
  throw new TypeError('Wrong value')
}, SyntaxError)
js
const assert = require('node:assert/strict')

assert.doesNotThrow(() => {
  throw new TypeError('Wrong value')
}, SyntaxError)

ومع ذلك، سيؤدي ما يلي إلى AssertionError مع رسالة "تم الحصول على استثناء غير مرغوب فيه...":

js
import assert from 'node:assert/strict'

assert.doesNotThrow(() => {
  throw new TypeError('Wrong value')
}, TypeError)
js
const assert = require('node:assert/strict')

assert.doesNotThrow(() => {
  throw new TypeError('Wrong value')
}, TypeError)

إذا تم إطلاق AssertionError وتم توفير قيمة لمعلمة message، فسيتم إضافة قيمة message إلى رسالة AssertionError:

js
import assert from 'node:assert/strict'

assert.doesNotThrow(
  () => {
    throw new TypeError('Wrong value')
  },
  /Wrong value/,
  'Whoops'
)
// Throws: AssertionError: Got unwanted exception: Whoops
js
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.

js
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 } }
js
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.

js
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
js
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]) أو دوال التأكيد الأخرى بدلاً من ذلك.

إذا كانت message خاطئة، يتم تعيين رسالة الخطأ كقيم actual و expected مفصولة بـ operator المُقدمة. إذا تم توفير حجتي actual و expected فقط، فسيتم تعيين operator افتراضيًا إلى '!='. إذا تم توفير message كحجة ثالثة، فسيتم استخدامها كرسالة خطأ وسيتم تخزين الحجج الأخرى كخصائص على الكائن المُطرح. إذا تم توفير stackStartFn، فسيتم إزالة جميع أطر المكدس الموجودة فوق تلك الدالة من تتبع المكدس (انظر Error.captureStackTrace). إذا لم يتم تقديم أي حجج، فسيتم استخدام رسالة "Failed" الافتراضية.

js
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
js
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 لاقتطاع تتبع مكدس الاستثناء:

js
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)
//     ...
js
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 undefined أو null. هذا مفيد عند اختبار وسيطة error في الردود العكسية. يحتوي تتبع المكدس على جميع الإطارات من الخطأ الممرر إلى ifError() بما في ذلك الإطارات الجديدة المحتملة لـ ifError() نفسها.

js
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
js
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 مع التعبير العادي.

js
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
js
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().

js
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
js
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().

js
import assert from 'node:assert/strict'

assert.notDeepStrictEqual({ a: 1 }, { a: '1' })
// موافق
js
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.

js
import assert from 'node:assert'

assert.notEqual(1, 2)
// موافق

assert.notEqual(1, 1)
// AssertionError: 1 != 1

assert.notEqual(1, '1')
// AssertionError: 1 != '1'
js
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().

js
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
js
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 ستختلف رسالة الخطأ عن الرسالة التي تم طرحها في ملف! راجع أدناه لمزيد من التفاصيل.

js
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)
js
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)
js
import assert from 'node:assert/strict'

// Using `assert()` works the same:
assert(0)
// AssertionError: The expression evaluated to a falsy value:
//
//   assert(0)
js
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، أو إذا كانت asyncFn دالة، فإنه يتصل بالدالة على الفور وينتظر اكتمال الوعد المُرجَع. ثم يتحقق من رفض الوعد.

إذا كانت asyncFn دالة وتطرح خطأ بشكل متزامن، فإن assert.rejects() ستُعيد وعدًا مُرفوضًا مع ذلك الخطأ. إذا لم تُرجع الدالة وعدًا، فإن assert.rejects() ستُعيد وعدًا مُرفوضًا مع خطأ ERR_INVALID_RETURN_VALUE. في كلتا الحالتين، يتم تخطي مُعالِج الخطأ.

بالإضافة إلى الطبيعة غير المتزامنة لانتظار الإكمال، فإنها تتصرف بشكل مطابق لـ assert.throws().

إذا تم تحديده، يمكن أن يكون error عبارة عن Class، أو RegExp، أو دالة للتحقق من الصحة، أو كائن حيث سيتم اختبار كل خاصية، أو مثيل خطأ حيث سيتم اختبار كل خاصية بما في ذلك خصائص message و name غير القابلة للعد.

إذا تم تحديده، فإن message ستكون الرسالة التي يوفرها AssertionError إذا فشل asyncFn في الرفض.

js
import assert from 'node:assert/strict'

await assert.rejects(
  async () => {
    throw new TypeError('Wrong value')
  },
  {
    name: 'TypeError',
    message: 'Wrong value',
  }
)
js
const assert = require('node:assert/strict')

;(async () => {
  await assert.rejects(
    async () => {
      throw new TypeError('Wrong value')
    },
    {
      name: 'TypeError',
      message: 'Wrong value',
    }
  )
})()
js
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
  }
)
js
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
    }
  )
})()
js
import assert from 'node:assert/strict'

assert.rejects(Promise.reject(new Error('Wrong value')), Error).then(() => {
  // ...
})
js
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().

js
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
js
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 في الإلقاء أو في حالة فشل التحقق من صحة الخطأ.

مثال كائن/مثيل خطأ مخصص للتحقق من الصحة:

js
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
)
js
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 باستخدام المُنشئ:

js
import assert from 'node:assert/strict'

assert.throws(() => {
  throw new Error('Wrong value')
}, Error)
js
const assert = require('node:assert/strict')

assert.throws(() => {
  throw new Error('Wrong value')
}, Error)

التحقق من رسالة الخطأ باستخدام تعبيرات عادية:

يقوم استخدام تعبير عادي بتشغيل .toString على كائن الخطأ، وبالتالي سيتضمن أيضًا اسم الخطأ.

js
import assert from 'node:assert/strict'

assert.throws(() => {
  throw new Error('Wrong value')
}, /^Error: Wrong value$/)
js
const assert = require('node:assert/strict')

assert.throws(() => {
  throw new Error('Wrong value')
}, /^Error: Wrong value$/)

التحقق من الصحة المخصص للخطأ:

يجب أن تقوم الدالة بإرجاع true للإشارة إلى نجاح جميع عمليات التحقق الداخلية. خلاف ذلك، فإنه سيحدث فشل مع AssertionError.

js
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'
)
js
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. يرجى قراءة المثال أدناه بعناية إذا تم اعتبار استخدام سلسلة كحجة ثانية:

js
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]
js
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

[مستقر: 1 - تجريبي]

مستقر: 1 ثبات: 1.0 - تطوير مبكر

assert.partialDeepStrictEqual() يؤكد التكافؤ بين المعلمتين actual و expected من خلال مقارنة عميقة، مع ضمان وجود جميع الخصائص في المعلمة expected في المعلمة actual بقيم مكافئة، وعدم السماح بتحويل النوع. الفرق الرئيسي مع assert.deepStrictEqual() هو أن assert.partialDeepStrictEqual() لا يتطلب وجود جميع الخصائص في المعلمة actual في المعلمة expected. يجب أن تمر هذه الطريقة دائمًا باختبارات الحالات نفسها مثل assert.deepStrictEqual()، وتتصرف كمجموعة فرعية منها.

js
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
js
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