學習node.js 斷言的使用

assert模塊提供了一組簡單的斷言測試,分嚴格模式(strict)和遺留模式(legacy),嚴格模式下,對比的方式比較嚴格,好比說,0與'0'比較,會報錯,但在遺留模式下是能夠經過的。官方推薦使用嚴格模式, 因此本文基於strict模式下學習。git

如何使用嚴格模式

const assert = require('assert').strict; // 嚴格模式

assert.equal(0, '0') // error

全局使用strict模式後,assert.equal()assert.strictEqual()的效果是同樣的。
若是不想全局使用的話,能夠直接使用帶strict的方法。github

const assert = require('assert') // 遺留模式

assert.equal(0, '0') // success
assert.strictEqual(0, '0') // error

assert.AssertionError

Error的子類,表示斷言失敗,assert模塊拋出的錯誤都是AssertionError的實例。正則表達式

相似於下面這個class,實際上的AssertionError是由ES5寫的,下面這個只是方便理解傳入的參數promise

interface IOptions {
  message?: string; // 設置錯誤的信息
  actual?: any; // 設置錯誤實例上的實際值
  expected?: any; // 設置錯誤實例上的指望值
  operator?: string; // 設置用於比較的操做或觸發錯誤的斷言函數
  stackStartFn(): any; // 生成的堆棧跟蹤將移除全部幀直到提供的函數
}


class AssertionError extends Error {
  constructor(options: IOptions) {
    // ...
  }
}

assert(value: any, message?: string | Error)

檢測是否爲真值,是assert.ok的別名。異步

assert.ok(value: any, message?: string | Error)

檢測value是否爲真值。
若是不爲真值,拋出屬性messagemessage參數值的AssertionError,若是未定義,爲默認錯誤信息。
若是是Error的實例,則拋出Error實例。(如下關於message的使用都同樣)async

assert.strictEqual(actual: any, expected: any, message?: string | Error)

檢測 actual參數和expected參數之間的嚴格相等性,使用sameValue比較。函數

assert.deepStrictEqual(actual: any, expected: any, message?: string | Error)

檢測actual參數和expected參數之間的深度嚴格相等性,深度比較意味着子對象的可枚舉的自身屬性也經過如下規則進行遞歸計算。學習

assert.notStrictEqual(actual: any, expected: any, message?: string | Error)

檢測 actual參數和expected參數之間的嚴格不相等性,使用sameValue比較。測試

assert.notDeepStrictEqual(actual: any, expected: any, message?: string | Error)

檢測actual參數和expected參數之間的深度嚴格不相等性,深度比較意味着子對象的可枚舉的自身屬性也經過如下規則進行遞歸計算。ui

assert.fail(message?: string | Error = 'failed')

使用提供的錯誤消息或默認錯誤消息拋出 AssertionError。

assert.throws(fn: function, error?: regExp | function | object | Error, message?: string)

檢測fn函數拋出的錯誤是否與預期的錯誤error同樣。

fn爲一個會拋出錯誤的函數

error能夠爲多種類型,做爲與拋出的錯誤對比的樣本。

爲regExp時,能夠匹配拋出的錯誤。

assert.throws(() => {
  throw new Error('it is a error')
}, /^Error: it is a error$/);

爲function時,能夠自定義驗證函數

assert.throws(() => {
  throw new Error('it is a error')
}, (err) => {
  if ((err instanceof Error) && /error/.test(err)) {
    return true;
  }
});

爲object時,將僅測試驗證對象error上的屬性。

const err = new TypeError('錯誤值');
err.code = 404;
err.foo = 'bar';
err.info = {
  nested: true,
  baz: 'text'
};
err.reg = /abc/i; // 正則表達式只有當驗證對象包含相同的正則表達式時才經過。

assert.throws(() => {
  throw err;
}, {
  name: 'TypeError',
  message: '錯誤值'
  info: {
    nested: true,
    baz: 'text'
    // 使用嵌套對象須要存在全部屬性。
    // 不然驗證將失敗。
    // 沒法對嵌套屬性使用正則表達式!
  }
});

爲Error時,用instanceof檢測是不是該實例。

注意, error 不能是字符串。 若是提供了一個字符串做爲第二個參數,則假定 error 被忽略,而字符串將用於 message。

assert.reject(asyncFn: function | promise, error?: regExp | function | object | Error, message?: string)

assert.throws的異步版本。

asyncFn爲一個function時

當即執行該函數,若是該函數不返回promise,則返回一個被拒絕(reject)的 Promise。
若是該函數同步拋出一個錯誤,返回一個帶有該錯誤的被拒絕的 Promise。

asyncFn爲一個Promise時

等待Promise執行,檢測是否被拒絕。

assert.ifError(value: any)

若是value不爲null或者undefined就將value做爲錯誤拋出。
在回調中測試error參數時,這頗有用。

相關文章
相關標籤/搜索