Node.js API詳解之 assert模塊用法實例分析
本文實例講述了Node.js API詳解之 assert模塊用法。分享給大家供大家參考,具體如下:
Node.js API詳解之 assert
assert 模塊提供了斷言測試的函數(shù),用于測試不變式。
斷言是編程術(shù)語,表示為一些布爾表達(dá)式,程序員相信在程序中的某個特定點(diǎn)該表達(dá)式值為真,
可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言而在部署時禁用斷言。
同樣,程序投入運(yùn)行后,最終用戶在遇到問題時可以重新啟用斷言。
使用斷言可以創(chuàng)建更穩(wěn)定、品質(zhì)更好且不易于出錯的代碼。
當(dāng)需要在一個值為false時中斷當(dāng)前操作的話,可以使用斷言。
單元測試必須使用斷言(Junit/JunitX)。
使用方式:
const assert = require('assert');
assert.ok(value[, message])
說明:
測試 value 是否為真值。 相當(dāng)于 assert.equal(!!value, true, message)。
如果 value 不為真值,則拋出一個帶有 message 屬性的 AssertionError,
其中 message 屬性的值等于傳入的 message 參數(shù)的值。
如果 message 參數(shù)為 undefined,則賦予默認(rèn)的錯誤信息。
demo:
const assert = require('assert'); assert.ok(true); // 測試通過。 assert.ok(1); // 測試通過。 assert.ok(false); // 拋出 "AssertionError: false == true" assert.ok(0); // 拋出 "AssertionError: 0 == true" assert.ok(false, '不是真值'); // 拋出 "AssertionError: 不是真值"
assert(value[, message])
說明:
assert.ok() 的別名。
用法與 assert.ok() 相同。
demo:
const assert = require('assert'); assert(true); // 測試通過。 assert(1); // 測試通過。 assert(false); // 拋出 "AssertionError: false == true" assert(0); // 拋出 "AssertionError: 0 == true" assert(false, '不是真值'); // 拋出 "AssertionError: 不是真值"
assert.ifError(value)
說明:
如果 value 為真,則拋出 value。 可用于測試回調(diào)函數(shù)的 error 參數(shù)。
源碼:function ifError(err) { if (err) throw err; };
demo:
const assert = require('assert'); assert.ifError(0); // 通過。 assert.ifError(1); // 拋出 1。 assert.ifError('error'); // 拋出 'error'。 assert.ifError(new Error()); // 拋出 Error。
assert.equal(actual, expected[, message])
說明:
使用相等運(yùn)算符(==)測試 actual 參數(shù)與 expected 參數(shù)是否相等
demo:
const assert = require('assert'); assert.equal(1, 1); // 測試通過,1 == 1。 assert.equal(1, '1'); // 測試通過,1 == '1'。 assert.equal(1, 2); // 拋出 AssertionError: 1 == 2 assert.equal({ a: { b: 1 } }, { a: { b: 1 } }); // 拋出 AssertionError: { a: { b: 1 } } == { a: { b: 1 } }
assert.deepEqual(actual, expected[, message])
說明:
測試 actual 參數(shù)與 expected 參數(shù)是否深度相等。 原始值使用相等運(yùn)算符(==)比較。
只測試可枚舉的自身屬性,不測試對象的原型、連接符、或不可枚舉的屬性(這些情況使用 assert.deepStrictEqual())。
Map 和 Set 包含的子項也會被測試。
如果兩個值不相等,則拋出一個帶有 message 屬性的 AssertionError,
其中 message 屬性的值等于傳入的 message 參數(shù)的值。
如果 message 參數(shù)為 undefined,則賦予默認(rèn)的錯誤信息。
demo:
const assert = require('assert'); const obj1 = { a: { b: 1 } }; const obj2 = { a: { b: 2 } }; const obj3 = { a: { b: 1 } }; const obj4 = Object.create(obj1); assert.deepEqual(/a/gi, new Date()); //測試通過,因為 RegExp 對象的屬性不是可枚舉的: assert.deepEqual(obj1, obj1); // 測試通過,對象與自身相等。 assert.deepEqual(obj1, obj2); // 拋出 AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } } // 因為 b 屬性的值不同。 assert.deepEqual(obj1, obj3); // 測試通過,兩個對象相等。 assert.deepEqual(obj1, obj4); // 拋出 AssertionError: { a: { b: 1 } } deepEqual {} // 因為不測試原型。
assert.deepStrictEqual(actual, expected[, message])
說明:
與 assert.deepEqual() 大致相同,但有一些區(qū)別:
1.原始值使用全等運(yùn)算符(===)比較。Set 的值與 Map 的鍵使用 SameValueZero 比較。
2.對象的原型也使用全等運(yùn)算符比較。
3.對象的類型標(biāo)簽要求相同。
4.比較[對象包裝器][]時,其對象和里面的值要求相同。
demo:
const assert = require('assert'); assert.deepEqual({ a: 1 }, { a: '1' }); // 測試通過,因為 1 == '1'。 assert.deepStrictEqual({ a: 1 }, { a: '1' }); // 拋出 AssertionError: { a: 1 } deepStrictEqual { a: '1' } // 因為使用全等運(yùn)算符 1 !== '1'。 // 以下對象都沒有自身屬性。 const date = new Date(); const object = {}; const fakeDate = {}; Object.setPrototypeOf(fakeDate, Date.prototype); assert.deepEqual(object, fakeDate); // 測試通過,不測試原型。 assert.deepStrictEqual(object, fakeDate); // 拋出 AssertionError: {} deepStrictEqual Date {} // 因為原型不同。 assert.deepEqual(date, fakeDate); // 測試通過,不測試類型標(biāo)簽。 assert.deepStrictEqual(date, fakeDate); // 拋出 AssertionError: 2017-03-11T14:25:31.849Z deepStrictEqual Date {} // 因為類型標(biāo)簽不同。 assert.deepStrictEqual(new Number(1), new Number(2)); // 測試不通過,因為數(shù)值對象包裝器里面的數(shù)值也會被比較。 assert.deepStrictEqual(new String('foo'), Object('foo')); // 測試通過,因為這兩個對象和里面的字符串都是相同的
assert.strictEqual(actual, expected[, message])
說明:
使用全等運(yùn)算符(===)測試 actual 參數(shù)與 expected 參數(shù)是否全等。
demo:
onst assert = require('assert'); assert.strictEqual(1, 2); // 拋出 AssertionError: 1 === 2 assert.strictEqual(1, 1); // 測試通過。 assert.strictEqual(1, '1'); // 拋出 AssertionError: 1 === '1'
assert.notEqual(actual, expected[, message])
說明:
使用不等運(yùn)算符(!=)測試 actual 參數(shù)與 expected 參數(shù)是否不相等。
demo:
const assert = require('assert'); assert.notEqual(1, 2); // 測試通過。 assert.notEqual(1, 1); // 拋出 AssertionError: 1 != 1 assert.notEqual(1, '1'); // 拋出 AssertionError: 1 != '1'
assert.notDeepEqual(actual, expected[, message])
說明:
測試 actual 參數(shù)與 expected 參數(shù)是否不深度相等。 與 assert.deepEqual() 相反。
demo:
const assert = require('assert'); const obj1 = { a: { b: 1 } }; const obj2 = { a: { b: 2 } }; const obj3 = { a: { b: 1 } }; const obj4 = Object.create(obj1); assert.notDeepEqual(obj1, obj1); // 拋出 AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } } assert.notDeepEqual(obj1, obj2); // 測試通過,obj1 與 obj2 不深度相等。 assert.notDeepEqual(obj1, obj3); // 拋出 AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } } assert.notDeepEqual(obj1, obj4); // 測試通過,obj1 與 obj4 不深度相等。
assert.notDeepStrictEqual(actual, expected[, message])
說明:
測試 actual 參數(shù)與 expected 參數(shù)是否不深度全等。 與 assert.deepStrictEqual() 相反。
demo:
const assert = require('assert'); assert.notDeepEqual({ a: 1 }, { a: '1' }); // 拋出 AssertionError: { a: 1 } notDeepEqual { a: '1' } assert.notDeepStrictEqual({ a: 1 }, { a: '1' }); // 測試通過。
assert.notStrictEqual(actual, expected[, message])
說明:
使用不全等運(yùn)算符(!==)測試 actual 參數(shù)與 expected 參數(shù)是否不全等。
demo:
const assert = require('assert'); assert.notStrictEqual(1, 2); // 測試通過。 assert.notStrictEqual(1, 1); // 拋出 AssertionError: 1 !== 1 assert.notStrictEqual(1, '1'); // 測試通過。 assert.fail(message)
assert.fail(actual, expected[, message[, operator[, stackStartFunction]]])
說明:
拋出 AssertionError。 如果 message 參數(shù)為空,則錯誤信息為 actual 參數(shù) + operator 參數(shù) + expected 參數(shù)。
如果只提供了 actual 參數(shù)與 expected 參數(shù),則 operator 參數(shù)默認(rèn)為 ‘!='。
如果提供了 message 參數(shù),則它會作為錯誤信息,其他參數(shù)會保存在錯誤對象的屬性中。
如果提供了 stackStartFunction 參數(shù),則該函數(shù)上的棧幀都會從棧信息中移除
demo:
const assert = require('assert'); assert.fail(1, 2, undefined, '>'); // 拋出 AssertionError [ERR_ASSERTION]: 1 > 2 assert.fail(1, 2, '錯誤信息'); // 拋出 AssertionError [ERR_ASSERTION]: 錯誤信息 assert.fail(1, 2, '錯誤信息', '>'); // 拋出 AssertionError [ERR_ASSERTION]: 錯誤信息 // 上面兩個例子的 `actual` 參數(shù)、`expected` 參數(shù)與 `operator` 參數(shù)不影響錯誤消息。 assert.fail(); // 拋出 AssertionError [ERR_ASSERTION]: Failed assert.fail('錯誤信息'); // 拋出 AssertionError [ERR_ASSERTION]: 錯誤信息 assert.fail('a', 'b'); // 拋出 AssertionError [ERR_ASSERTION]: 'a' != 'b' //使用 stackStartFunction 參數(shù)攔截異常的棧信息: 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.throws(block[, error][, message])
說明:
斷言 block 函數(shù)會拋出錯誤。
error 參數(shù)可以是構(gòu)造函數(shù)、正則表達(dá)式、或自定義函數(shù)。
如果指定了 message 參數(shù),則當(dāng) block 函數(shù)不拋出錯誤時,message 參數(shù)會作為 AssertionError 的錯誤信息。
demo:
const assert = require('assert'); assert.throws( () => { throw new Error('錯誤信息'); }, /123/ ); // Error: 錯誤信息 assert.throws( () => { throw new Error('錯誤信息'); }, /錯誤/ ); // 通過 assert.throws( () => { throw new Error('錯誤信息'); }, Error ); // 通過 assert.throws( () => { throw new Error('錯誤信息'); }, function(err) { if ((err instanceof Error) && /錯誤/.test(err)) { return true; } }, '不是期望的錯誤' ); // 通過 // error 參數(shù)不能是字符串。 如果第二個參數(shù)是字符串,則視為省略 error 參數(shù),傳入的字符串會被用于 message 參數(shù)。 // 這是錯誤的!不要這么做! assert.throws(() => { throw new Error('錯誤信息'); }, '錯誤信息', '沒有拋出期望的信息'); // 應(yīng)該這么做。 assert.throws(() => { throw new Error('錯誤信息'); }, /錯誤信息/, '沒有拋出期望的信息');
assert.doesNotThrow(block[, error][, message])
說明:
斷言 block 函數(shù)不會拋出錯誤。
當(dāng) assert.doesNotThrow() 被調(diào)用時,它會立即調(diào)用 block 函數(shù)。
如果拋出錯誤且錯誤類型與 error 參數(shù)指定的相同,則拋出 AssertionError。
如果錯誤類型不相同,或 error 參數(shù)為 undefined,則拋出錯誤。
demo:
const assert = require('assert'); assert.doesNotThrow( () => { throw new TypeError('錯誤信息'); }, SyntaxError ); // TypeError: 錯誤信息 assert.doesNotThrow( () => { throw new TypeError('錯誤信息'); }, TypeError ); // AssertionError [ERR_ASSERTION]: Got unwanted exception. // 錯誤信息 // 如果拋出了 AssertionError 且有給 message 參數(shù)傳值,則 message 參數(shù)的值會被附加到 AssertionError 的信息中: assert.doesNotThrow( () => { throw new TypeError('錯誤信息'); }, TypeError, '拋出錯誤' ); // AssertionError [ERR_ASSERTION]: Got unwanted exception: 拋出錯誤 // 錯誤信息
注意事項
說明:
對于 SameValueZero 比較,建議使用 ES2015 的 Object.is()。
demo:
const a = 0; const b = -a; assert.notStrictEqual(a, b); // 拋出 AssertionError: 0 !== -0 // 因為全等運(yùn)算符不區(qū)分 -0 與 +0。 assert(!Object.is(a, b)); // 但 Object.is() 可以區(qū)分。 const str1 = 'foo'; const str2 = 'foo'; assert.strictEqual(str1 / 1, str2 / 1); // 拋出 AssertionError: NaN === NaN // 因為全等運(yùn)算符不能用于測試 NaN。 assert(Object.is(str1 / 1, str2 / 1)); // 但 Object.is() 可以測試。
SameValueZero
說明:
內(nèi)部比較操作SameValueZero(x,y)
如果 type of x 不同于 type of y,返回false。
如果 type of x 是數(shù)字,那么
如果 x 為 NaN, y 為 NaN,返回 true。
如果 x 是 +0 而 y 是 -0,返回 true。
如果 x 是 -0 而 y 是 +0,返回 true。
如果 x 與 y 相同,則返回 true。
返回 假。
希望本文所述對大家node.js程序設(shè)計有所幫助。
相關(guān)文章
Node.js 使用axios讀寫influxDB的方法示例
這篇文章主要介紹了Node.js 使用axios讀寫influxDB的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10簡單聊一聊Node.js參數(shù)max-old-space-size
簡單的說Node.js就是運(yùn)行在服務(wù)端的JavaScript,下面這篇文章主要給大家介紹了關(guān)于Node.js參數(shù)max-old-space-size的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01nodejs入門教程五:連接數(shù)據(jù)庫的方法分析
這篇文章主要介紹了nodejs入門教程之連接數(shù)據(jù)庫的方法,結(jié)合實例形式分析了nodejs連接數(shù)據(jù)庫的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-04-04