在程序設(shè)計(jì)中,斷言(assertion)是一種放在程序中的一階邏輯(如一個(gè)結(jié)果為真或是假的邏輯判斷式)着降,目的是為了標(biāo)示與驗(yàn)證程序開(kāi)發(fā)者預(yù)期的結(jié)果-當(dāng)程序運(yùn)行到斷言的位置時(shí),對(duì)應(yīng)的斷言應(yīng)該為真。若斷言不為真時(shí)病游,程序會(huì)中止運(yùn)行衷戈,并給出錯(cuò)誤消息狭吼。 -- 維基百科
斷言是單元測(cè)試中用來(lái)保證最小單元是否正常的檢測(cè)方法。如在demo.js中輸出一個(gè)錯(cuò)誤的兩數(shù)求和函數(shù)add:
//demo.js
module.exports = function(a,b){
//此處寫(xiě)成兩數(shù)相減
return a - b;
}
然后創(chuàng)建一個(gè)test.js殖妇,使用nodejs提供的assert模塊進(jìn)行檢測(cè):
//test.js
'use strict'
const assert = require('assert');
const add = require('./demo');
assert.strictEqual(add(1,2),3);
顯然由于函數(shù)自身錯(cuò)誤刁笙,得到的值無(wú)法滿(mǎn)足期望,此時(shí)程序?qū)?huì)拋出一個(gè)AssertionError異常(assert 模塊拋出的所有錯(cuò)誤都是 AssertionError 類(lèi)的實(shí)例)谦趣,停止運(yùn)行:
在nodejs的API中定義了幾種檢測(cè)方法:
assert.ok() : 判斷結(jié)果是否為真疲吸。
assert.ok(false,'此為假');
//等同于
assert.equal(!!(add(1,2) === 3),true,'此為假');
assert.ifError() : 判斷實(shí)際值是否為一個(gè)假值(null,undefined,0,'',false),如實(shí)際值為真值前鹅,則拋出異常摘悴。
assert.ifError('');
assert.ifError(' '); //Error: " "
assert.equal() : 判斷實(shí)際值與期望值是否相等。
assert.notEqual() : 判斷實(shí)際值與期望值是否相等舰绘。
assert.equal(add(1,2),3);
assert.notEqual(add(1,2),3);
assert.deepStrictEqual() : 判斷實(shí)際值與期望值是否深度相等蹂喻。
assert.notDeepStrictEqual : 判斷實(shí)際值與期望值是否不深度相等
assert.deepStrictEqual({a:1},{a:'1'});
assert.notDeepStrictEqual({a:1},{a:'1'});
assert.strictEqual() : 判斷實(shí)際值與期望值是否嚴(yán)格相等(相當(dāng)于 ===)
assert.notStrictEqual() : 判斷實(shí)際值與期望值是否不嚴(yán)格相等(相當(dāng)于 葱椭!==)
assert.strictEqual(1,true);
assert.notStrictEqual(1,true);
assert.throws() : 判斷代碼塊是否拋出異常。
assert.doesNotThrow() : 判斷代碼塊是否沒(méi)有拋出異常口四。
//assert.throws(fn[, error][, message])
assert.throws(
() => {
throw new Error('錯(cuò)誤值')
},
{
message:'錯(cuò)誤',
}
)
assert.throws(
() => {
throw new Error('錯(cuò)誤值')
},
{
message:'錯(cuò)誤',
},'拋出異常不符合期望'
)
//assert.doesNotThrow(fn[, error][, message])
assert.doesNotThrow(
() => {
throw new TypeError('錯(cuò)誤值');
},
/錯(cuò)誤值/,
'出錯(cuò)啦'
);
assert.doesNotThrow(
() => {
throw new TypeError('錯(cuò)誤值');
}
);
assert.throws(fn[, error][, message])
-
fn
<Function> -
error
<RegExp> | <Function> | <Object> | <Error> -
message
<string>
期望 fn 函數(shù)拋出異常孵运。error 則用于指定拋出期望的錯(cuò)誤。如果指定 message蔓彩,則當(dāng) fn 調(diào)用無(wú)法拋出或錯(cuò)誤驗(yàn)證失敗時(shí)治笨, message 將附加到 AssertionError 提供的消息。
assert.doesNotThrow(fn[, error][, message])
-
fn
<Function> -
error
<RegExp> | <Function> -
message
<string>
斷言 fn 函數(shù)不會(huì)拋出錯(cuò)誤赤嚼。若拋出錯(cuò)誤且與 error 參數(shù)指定的類(lèi)型相同旷赖,則拋出AssertionError。若不同或error參數(shù)未定義探膊,則錯(cuò)誤將傳播回調(diào)用方杠愧。
斷言用于檢查程序在運(yùn)行時(shí)是否滿(mǎn)足期望。一旦斷言檢查失敗逞壁,將會(huì)拋出異常停止整個(gè)應(yīng)用流济。當(dāng)需要進(jìn)行多處斷言檢查時(shí),就需要借助于測(cè)試框架(如:mocha)腌闯,將各測(cè)試統(tǒng)一起來(lái)執(zhí)行绳瘟,并記錄執(zhí)行時(shí)拋出的異常,最后輸出測(cè)試結(jié)果姿骏。