• <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>

    node.js學習之斷言assert的使用

    一、斷言是編程術語,表示為一些布爾表達式,程序員相信在程序中的某個特定點該表達式值為真,可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言而在部署時禁用斷言。同樣,程序投入運行后,最終用戶在遇到問題時可以重新啟用斷言。

    使用斷言可以創建更穩定、品質更好且 不易于出錯的代碼。當需要在一個值為FALSE時中斷當前操作的話,可以使用斷言。【單元測試】必須使用斷言。

    Node提供了 10 多個斷言測試的函數,用于測試不變式,我在文章中中將這 10 多個函數進行了分組,方便理解記憶。

    【提示】在本文章中,expected 代表預期值,actual 代表實際值, message 代表自定義信息

    工具/原料

    • JavaScript

    方法/步驟

    1. 1

      二、判斷值是否為真值

      判斷值是否為真值有以下兩個斷言測試函數

      2.1 assert(value[, message])

      這個測試函數在 【Boolean(value)】 為 【true】時通過斷言測試,否則拋出 【AssertionError】

    2. 2

      上面代碼中 value 為false,則拋出一個帶有 message 屬性的 【AssertionError】,其中 message 屬性的值等于傳入的 message 參數的值。 【如果 message 參數為 undefined,則賦予默認的錯誤信息】。

    3. 3

      上面代碼由于沒有指定【message】參數,拋出的為默認錯誤信息的【AssertionError】

      2.2 assert.ok(value[, message])

      assert.ok() 與 assert()的作用是一樣的,都是測試【value】是否為真值。而且用法也一樣,所以可以將assert()視為assert.ok()的語法糖

    4. 4

      三、判斷預期值和實際值相等(==)

      這一組里面有兩個測試函數,用于測試預期值與實際值是否相等,如果相等則斷言通過,否則拋出 【AssertionError】

      3.1 assert.equal(actual, expected[, message])

      assert.equal()用于測試期望值和實際值是否相等,【在值類型的時候比較的是兩個值是否相等,當預期值和實際值為引用類型的時候,比較的是值得引用】

    5. 5

      3.2 assert.deepEqual(actual, expected[, message])

      同樣也是測試 預期值 和 實際值 是否相等,使用的仍然是(==),但是與equal不同的是,【deepEqual()在對引用類型進行比較的時候,不是對值的引用進行比較,而是比較的對象的屬性值】

    6. 6

      上面代碼是對引用類型的比較,可以看出【deepEqual() 】比較的是屬性值,而非引用,這是與equal()不同的地方。

      【注意!!】deepEqual()只測試可枚舉的自身屬性,不測試對象的原型、連接符、或不可枚舉的屬性(這些情況使用 assert.deepStrictEqual() ,稍后會總結到)

    7. 7

      上面代碼中 ena 和 enb 用于相同的可枚舉屬性【name】,有著值不同的不可枚舉屬性【hobby】,說明【deepEqual()不測試對象的不可枚舉的屬性】

      四. 判斷預期值和實際值全等(===)

      這組測試函數是用于判斷預期值和實際值是否深度相等的,內部使用的是(===),所以對象的原型也會進行比較,值得類型也是比較的范圍。這組也有兩個測試函數。

      4.1 assert.deepStrictEqual(actual, expected[, message])

      由于內部使用的是全等(===),所以對象的原型也會計入比較的范圍

    8. 8

      上面代碼使用了deepEqual()和deepStrictEqual()進行了斷言測試,son1 和 son2 分別繼承與兩個不同的對象,但是擁有相同的屬性值。可以看出【deepEqual()是不會考慮對象的原型的,deepStrictEqual()將原型對象列入了比較對象】

      4.2 assert.strictEqual(actual, expected[, message])

      strictEqual()是equal()的加強,考慮了數據類型;如果actual === expected,則斷言通過,否則拋出AssertionError,message?message:默認錯誤信息。

    9. 9

      【提示!!】對引用類型還是永遠通不過【strictEqual()】斷言測試

      五、判斷預期值和實際值不相等(!=)

      上面總結到了判斷預期值和實際值相等,這兒總結一下判斷預期值和實際值不想等的兩個測試函數,實際上就是上面 (三) 的逆運算。

      5.1 assert.notEqual(actual, expected[, message])

      【notEqual()】為 【equal() 】的逆運算,如果 actual!= expected 則斷言通過,同樣對于值類型是單純對值進行比較,對應引用類型比較的是值得引用

    10. 10

      上面的代碼是對引用類型進行的斷言測試,【notEqual() 】對于兩個對象的測試通過是一個【恒成立】的結果。

      5.2 assert.notDeepEqual(actual, expected[, message])

      【notDeepEqual() 】為 【deepEqual() 】的逆運算,如果 actual!= expected 則斷言通過,不同于notEqual()的是對于引用類型是對值進行判斷,不比對原型、不可枚舉屬性,只比對自有可枚舉屬性,斷言通過。

    11. 11

      上面代碼中最后一個表達式斷言通過,說明【不比對原型、不可枚舉屬性,只比對自有可枚舉屬性】

      【注意!!】與notEqual的區別,也就是deepEqual和equal的區別,在引用數據類型的時候,deepEqual是比較的值而非引用,equal對比的是引用,所以引用類型在equal的時候是永遠無法通過斷言測試的,以此類推,引用類型在notEqual時是永遠否可以通過斷言測試的。

      六. 判斷預期值和實際值嚴格不相等(!==)

      上面總結到了判斷預期值和實際值嚴格相等,這兒總結一下判斷預期值和實際值嚴格不相等的兩個測試函數,實際上就是上面 (四) 的逆運算

      6.1 assert.notStrictEqual(actual, expected[, message])

      如果actual與expected不 !== 則斷言通過, 與 assert.deepStrictEqual() 相反

    12. 12

      6.2 assert.notDeepStrictEqual(actual, expected[, message])

      notDeepStrictEqual()就是deepStrictEqual()的逆運算,如果 actual !== expected 則斷言通過,否則拋出AssertionError。

    13. 13

      七. 斷言錯誤并拋出

      這一組有 四 個(可以說是 三 個)測試函數,是對錯誤進行的處理。

      7.1 assert.fail(message)

      這個測試函數不多說,可以看錯是下一個函數的重載,用于主動拋出帶有【message】屬性的【AssertionError】對象

    14. 14

      7.2 assert.fail(actual, expected[, message[, operator[, stackStartFunction]]])

      該測試函數用于主動拋出自定義錯誤信息,拋出錯誤信息格式:【actual 參數 + operator 參數 + expected 參數】

    15. 15

      7.3 assert.throws(block,error, message)

      參數說明:

      block | Function

      error | RegExp | Function

      message | any

      【說明!!】如果block拋出的錯誤滿足error參數,也就是拋出錯誤與期望一致,則斷言通過,否則拋出block中的錯誤,如果block不拋出錯誤,則拋出【AssertionError 】。

      【提示!!】error 參數可以是構造函數、正則表達式、或自定義函數。

    16. 16

      上面代碼中 error 參數為正則表達式,【block】拋出的錯誤滿足正則表達式,所以斷言通過。 

      【注意!!】error 參數不能是字符串。 如果第二個參數是字符串,則視為省略 error 參數,傳入的字符串會被用于 【message】 參數,

    17. 17

      7.4 assert.doesNotThrow(block, error, message)

      【說明!!】預期的錯誤和實際的錯誤一致時,不拋出實際錯誤,拋出AssertionError,不一致則拋出實際錯誤信息

    18. 18

      八. 判斷值是否為真

      這兒只有一個測試函數了

      8.1 assert.ifError(value)

      如果value的值為真或者可以轉換成true,則拋出value,否則斷言通過。

    • 發表于 2018-01-29 00:00
    • 閱讀 ( 734 )
    • 分類:其他類型

    你可能感興趣的文章

    相關問題

    0 條評論

    請先 登錄 后評論
    聯系我們:uytrv@hotmail.com 問答工具
  • <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>
    久久久久精品国产麻豆