本篇僅是我的對於assert斷言學習的梳理,也但願能夠給開始學習assert同窗提供一個基礎框架。node
assert模塊提供了一組簡單的斷言測試,可用於測試不變量。
存在嚴格模式(strict)和 遺留模式(legacy),但建議僅使用嚴格模式。數組
Error的子類,代表斷言的失敗。assert模塊拋出的全部錯誤都是AssertionError類的實例框架
注意:在最新的node版本中不含strict的方法已經被廢棄函數
assert(true, 'message'); //輸出 undefined assert(false, 'message'); //輸出 AssertionError: message
assert.strictEqual(1, 1, 'message'); //輸出 undefined assert.strictEqual(1, '1', 'message'); //輸出 AssertionError: message assert.strictEqual(1, '1', 'message'); //輸出 AssertionError: message
assert.deepStrictEqual(actual, expected, [message])
測試 actual 參數和 expected 參數之間的深度相等。
1.當比較的雙方均爲基本類型時,等價於euqal()。
2.當比較的雙方均爲引用類型時,即將引用類型中的每個屬性用equal()進行比較。
比較規則學習
使用 SameValue比較(使用 Object.is())來比較原始值。 對象的類型標籤應該相同。 使用嚴格相等比較來比較對象的原型。 只考慮可枚舉的自身屬性。 始終比較 Error 的名稱和消息,即便這些不是可枚舉的屬性。 可枚舉的自身 Symbol 屬性也會比較。 對象封裝器做爲對象和解封裝後的值都進行比較。 Object 屬性的比較是無序的。 Map 鍵名與 Set 子項的比較是無序的。 當兩邊的值不相同或遇到循環引用時,遞歸中止。
const assert = require('assert').strict; // 失敗,由於 1 !== '1'。 assert.deepStrictEqual({ a: 1 }, { a: '1' }); // 如下對象沒有自身屬性。 const date = new Date(); const object = {}; const fakeDate = {}; Object.setPrototypeOf(fakeDate, Date.prototype); // 原型不一樣: assert.deepStrictEqual(object, fakeDate); // - {} // + Date {} // 類型標籤不一樣: assert.deepStrictEqual(date, fakeDate); // - 2018-04-26T00:49:08.604Z // + Date {} assert.deepStrictEqual(NaN, NaN); // 經過,由於使用 SameValue 比較。 // 解封裝後的數字不一樣: assert.deepStrictEqual(new Number(1), new Number(2)); // - [Number: 1] // + [Number: 2] assert.deepStrictEqual(new String('foo'), Object('foo')); // 經過,由於對象與解封裝後的字符串都是相同的。 assert.deepStrictEqual(-0, -0); // 經過。 // 使用 SameValue 比較的零不一樣: assert.deepStrictEqual(0, -0); // - 0 // + -0 const symbol1 = Symbol(); const symbol2 = Symbol(); assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol1]: 1 }); // 經過,由於在兩個對象上的 symbol 相同。 assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol2]: 1 }); // { // [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); // WeakMap { // - [items unknown] // + [items unknown], // + unequal: true // }
const assert = require('assert').strict; assert.fail(); // AssertionError [ERR_ASSERTION]: Failed assert.fail('失敗'); // AssertionError [ERR_ASSERTION]: 失敗 assert.fail(new TypeError('須要數組')); // TypeError: 須要數組