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