Node.js-assert - 斷言

node.js之assert學習梳理

本篇僅是我的對於assert斷言學習的梳理,也但願能夠給開始學習assert同窗提供一個基礎框架。node

1、assert概念

assert模塊提供了一組簡單的斷言測試,可用於測試不變量。
存在嚴格模式(strict)和 遺留模式(legacy),但建議僅使用嚴格模式。數組

2、assert.AssertionError 類

Error的子類,代表斷言的失敗。assert模塊拋出的全部錯誤都是AssertionError類的實例框架

3、assert方法的一些規律

  • equal、notEqual、deepEqual、notDeepEqual:使用'=='比較符進行比較。即:不含strict的方法,使用的都是'=='比較符。
  • strictEqual、notStrictEqual、strictDeepEqual、notStrictDeepEqual:使用'==='比較符進行比較。即:含strict的方法,使用的都是'==='比較符。
  • notEqual、notDeepEqual 、notStrictDeepEqual與不帶Not的方法正好相反,可是使用方式徹底相同。

注意:在最新的node版本中不含strict的方法已經被廢棄函數

4、assert方法詳解

  • assert(value[, message])
    等同於assert.ok(),用來判斷一個值是否爲真。若爲真,則會經過該行測試;若爲假,則會報錯。若是沒有第二個參數,則會默認報錯"AssertionError: value == true",若是第二個參數存在,則會拋出message的內容
assert(true, 'message');
//輸出 undefined
assert(false, 'message');
//輸出 AssertionError: message
  • assert.strictEqual(actual, expected, [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
    //   }
  • assert.fail([message])
    使用提供的錯誤消息或默認錯誤消息拋出 AssertionError。 若是 message 參數是 Error 的實例,則它將被拋出而不是 AssertionError。
const assert = require('assert').strict;

assert.fail();
// AssertionError [ERR_ASSERTION]: Failed

assert.fail('失敗');
// AssertionError [ERR_ASSERTION]: 失敗

assert.fail(new TypeError('須要數組'));
// TypeError: 須要數組
  • assert.ifError(value)
    若是 value 不爲 undefined 或 null,則拋出 value。
  • assert.throws(fn, error) 指望 fn 函數拋出錯誤(這個方法還不是很明白)
相關文章
相關標籤/搜索