Node assert的用法

assert模塊提供了斷言測試的函數(shù)拥坛,用于測試不變式

有strict和legacy兩種模式胜臊,建議只使用strict模式

assert.AssertionError類

error的一個子類庇绽,表明斷言的失敗苇侵。assert模塊跑出的所有錯誤都是AssertionError類的實例

strict模式

當使用strict模式時于未,任何assert函數(shù)都會使用嚴格函數(shù)模式的等式,所以assert.deepEqual()會等同于assert.deepStrictEqual()

除此以外萍鲸,涉及對象的錯誤信息會產生一個錯誤差異比較闷叉,而不是展示對方的對象,legacy模式則不會這樣

assert(value[,message])

ssert.ok()?的別名猿推。

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

strict 模式

assert.deepStrictEqual()?的別名片习。


If the values are not equal, an?AssertionError?is thrown with a?message?property set equal to the value of the?message?parameter. If the?message?parameter is undefined, a default error message is assigned. If the?message?parameter is an instance of an?Error?then it will be thrown instead of the?AssertionError.

如果值不相等,則會拋出一個AssertionError蹬叭,該消息屬性集等于消息參數(shù)的值藕咏。如果消息參數(shù)未定義,則指定一個默認的錯誤消息秽五。如果消息參數(shù)是一個錯誤的實例孽查,那么它將被拋出而不是AssertionError。

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

測試?actual?參數(shù)與?expected?參數(shù)是否深度相等坦喘。 深度相等意味著子對象中可枚舉的自身屬性也會按以下規(guī)則遞歸地比較

比較的詳細說明

原始值運用?SameValue比較法進行比較盲再,使用?Object.is()?函數(shù)。

對象的類型標簽應該相同瓣铣。

對象的原型使用全等運算符比較答朋。

只比較可枚舉的自身屬性

Error?的名稱與信息也會比較棠笑,即使不是可枚舉的屬性梦碗。

可枚舉的自身?Symbol?屬性也會比較。

對象封裝器?會同時比較對象與解封裝后的值蓖救。

Object?屬性的比較是無序的洪规。

Map?鍵名與?Set?子項的比較是無序的。

當兩邊的值不相同或遇到循環(huán)引用時循捺,遞歸會停止斩例。

WeakMap?與?WeakSet?的比較不依賴于它們的值。

assert.doesNotReject(block[, error][, message])

等待?block?的 promise 完成从橘,如果?block?是一個函數(shù)念赶,則立即調用該函數(shù)并等待返回的 promise 完成础钠,然后檢查 promise 是否被 reject。

如果?block?是一個函數(shù)且同步地拋出一個錯誤晶乔,則?assert.doesNotReject()?會返回一個被 reject 的?Promise?并傳入該錯誤珍坊。 如果該函數(shù)沒有返回一個 promise,則?assert.doesNotReject()?會返回一個被 reject 的?Promise?并傳入?ERR_INVALID_RETURN_VALUE?錯誤正罢。 以上兩種情況都會跳過錯誤處理函數(shù)阵漏。

error?可以是?ClassRegExp?或校驗函數(shù)

assert.doesNotThrow(block[, error][, message])


斷言?block?函數(shù)不會拋出錯誤翻具。

當?assert.doesNotThrow()?被調用時履怯,它會立即調用?block?函數(shù)。

如果拋出錯誤且錯誤類型與?error?參數(shù)指定的相同裆泳,則拋出?AssertionError叹洲。 如果錯誤類型不相同,或?error?參數(shù)為?undefined工禾,則拋出錯誤运提。

error?可以是?ClassRegExp?或校驗函數(shù)闻葵。

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


strict 模式

assert.strictEqual()?的別名

如果值不相等民泵,則用與消息參數(shù)的值相等的消息屬性集拋出斷言錯誤。如果消息參數(shù)未定義槽畔,則分配默認錯誤消息栈妆。如果消息參數(shù)是錯誤的實例,那么它將被拋出而不是斷言錯誤厢钧。

assert.fail([message])

拋出?AssertionError鳞尔,并帶上提供的錯誤信息或默認的錯誤信息。 如果?message?參數(shù)是?Error?的實例早直,則會拋出它而不是?AssertionError


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


如果消息是偽造的寥假,則將錯誤消息設置為所提供的操作符所分離的實際值和期望值。如果只提供兩個實際的和預期的參數(shù)霞扬,操作員將默認為“昧旨!”=。如果消息被提供為第三個參數(shù)祥得,它將被用作錯誤消息,其他參數(shù)將作為拋出對象上的屬性存儲蒋得。如果提供了StActStaskFufft级及,則該函數(shù)之上的所有堆棧幀將從SttTrace中刪除(參見Error .CoprTestStAc跡)。如果未給出參數(shù)额衙,則將使用默認消息失敗饮焦。

const assert = require('assert').strict;

assert.fail('a', 'b');

// AssertionError [ERR_ASSERTION]: 'a' != 'b'

assert.fail(1, 2, undefined, '>');

// AssertionError [ERR_ASSERTION]: 1 > 2

assert.fail(1, 2, 'fail');

// AssertionError [ERR_ASSERTION]: fail

assert.fail(1, 2, 'whoops', '>');

// AssertionError [ERR_ASSERTION]: whoops

assert.fail(1, 2, new TypeError('need array'));

// TypeError: need array

在最后三種情況下怕吴,實際的、預期的和操作員對錯誤消息沒有影響县踢。StActStaskFor用于截斷異常STACKTrace:

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.ifError(value)

如果?value?不為?undefined?或?null转绷,則拋出?value。 可用于測試回調函數(shù)的?error?參數(shù)硼啤。 堆棧蹤跡會包含傳入?ifError()?的錯誤的所有幀议经,包括潛在的?ifError()?自身新增的幀。

const assert = require('assert').strict;

assert.ifError(null);

// 通過谴返。

assert.ifError(0);

// 拋出 AssertionError [ERR_ASSERTION]: ifError got unwanted exception: 0

assert.ifError('錯誤信息');

// 拋出 AssertionError [ERR_ASSERTION]: ifError got unwanted exception: '錯誤信息'

assert.ifError(new Error());

// 拋出 AssertionError [ERR_ASSERTION]: ifError got unwanted exception: Error

// 添加一些錯誤幀煞肾。

let err;

(function errorFrame() {

err = new Error('錯誤信息');

})();

(function ifErrorFrame() {

assert.ifError(err);

})();

// AssertionError [ERR_ASSERTION]: ifError got unwanted exception: 錯誤信息

// at ifErrorFrame

// at errorFrame

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


任何深度不等式的檢驗。與Advest.DeqQualQualor相反嗓袱。

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);

// OK

assert.notDeepEqual(obj1, obj3);

// AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } }

assert.notDeepEqual(obj1, obj4);// OK

如果值是深度相等的籍救,則拋出一個斷言錯誤,其消息屬性集等于消息參數(shù)的值渠抹。如果消息參數(shù)未定義蝙昙,則分配默認錯誤消息。如果消息參數(shù)是錯誤的實例梧却,那么它將被拋出而不是斷言錯誤奇颠。


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

測試?actual?參數(shù)與?expected?參數(shù)是否不深度全等。 與?assert.deepStrictEqual()?相反

const assert = require('assert').strict;

assert.notDeepStrictEqual({ a: 1 }, { a: '1' });

// 測試通過篮幢。

如果兩個值深度全等大刊,則拋出一個帶有?message?屬性的?AssertionError,其中?message?屬性的值等于傳入的?message?參數(shù)的值三椿。 如果?message?參數(shù)為?undefined缺菌,則賦予默認的錯誤信息。 如果?message?參數(shù)是?Error?的實例搜锰,則會拋出它而不是?AssertionError伴郁。

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


測試淺、強制不等式與抽象相等的比較!=

const assert = require('assert');

assert.notEqual(1, 2);

// OK

assert.notEqual(1, 1);

// AssertionError: 1 != 1

assert.notEqual(1, '1');

// AssertionError: 1 != '1'

如果值相等蛋叼,則用與消息參數(shù)的值相等的消息屬性集拋出斷言錯誤焊傅。如果消息參數(shù)未定義,則分配默認錯誤消息狈涮。如果消息參數(shù)是錯誤的實例狐胎,那么它將被拋出而不是斷言錯誤。

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

使用?SameValue比較法測試?actual?參數(shù)與?expected?參數(shù)是否不全等

const assert = require('assert').strict;

assert.notStrictEqual(1, 2);

// 測試通過歌馍。

assert.notStrictEqual(1, 1);

// 拋出 AssertionError [ERR_ASSERTION]: Identical input passed to notStrictEqual: 1

assert.notStrictEqual(1, '1');

// 測試通過握巢。

如果兩個值全等,則拋出一個帶有?message?屬性的?AssertionError松却,其中?message?屬性的值等于傳入的?message?參數(shù)的值暴浦。 如果?message?參數(shù)為?undefined溅话,則賦予默認的錯誤信息。 如果?message?參數(shù)是?Error?的實例歌焦,則會拋出它而不是?AssertionError飞几。

assert.ok(vaule[,message])


測試?value?是否為真值。 相當于?assert.equal(!!value, true, message)独撇。

如果?value?不為真值屑墨,則拋出一個帶有?message?屬性的?AssertionError,其中?message?屬性的值等于傳入的?message?參數(shù)的值券勺。 如果?message?參數(shù)為?undefined绪钥,則賦予默認的錯誤信息。 如果?message?參數(shù)是?Error?的實例关炼,則會拋出它而不是?AssertionError程腹。 如果沒有傳入參數(shù),則?message?會被設為字符串?'No value argument passed to `assert.ok()`'儒拂。

const assert = require('assert').strict;

assert.ok(true);// 測試通過寸潦。

assert.ok(1);// 測試通過社痛。

assert.ok();// 拋出 AssertionError: No value argument passed to `assert.ok()`

assert.ok(false, '不是真值');// 拋出 AssertionError: 不是真值

// 在 repl 中:

assert.ok(typeof 123 === 'string');// 拋出 AssertionError: false == true

// 在文件中(例如 test.js):

assert.ok(typeof 123 === 'string');// 拋出 AssertionError: The expression evaluated to a falsy value:

// assert.ok(typeof 123 === 'string')

assert.ok(false);

// 拋出 AssertionError: The expression evaluated to a falsy value:?

// assert.ok(false)

assert.ok(0);

// 拋出 AssertionError: The expression evaluated to a falsy value:

//

// assert.ok(0)

// 等同于 `assert()`:

assert(0);// 拋出 AssertionError: The expression evaluated to a falsy value://// assert(0)

assert.rejects(block[,error][,message])

等待?block?的 promise 完成见转,如果?block?是一個函數(shù),則立即調用該函數(shù)并等待返回的 promise 完成蒜哀,然后檢查 promise 是否被 reject斩箫。

如果?block?是一個函數(shù)且同步地拋出一個錯誤,則?assert.rejects()?會返回一個被 reject 的?Promise?并傳入該錯誤撵儿。 如果該函數(shù)沒有返回一個 promise乘客,則?assert.rejects()?會返回一個被 reject 的?Promise?并傳入?ERR_INVALID_RETURN_VALUE?錯誤。 以上兩種情況都會跳過錯誤處理函數(shù)淀歇。

該函數(shù)相當于?assert.throws()易核,除了需要等待完成的異步特性。

error?可以是?Class浪默、RegExp牡直、校驗函數(shù)、每個屬性都會被測試的對象纳决、或每個屬性(包括不可枚舉的?message?和?name?屬性)都會被測試的錯誤實例碰逸。

如果指定了?message,則當?block?沒被 reject 時阔加,message?參數(shù)會作為?AssertionError?的錯誤信息花竞。

(async () => {

await assert.rejects(

async () => {

throw new TypeError('錯誤信息'); },

{

name: 'TypeError',

message: '錯誤信息'

}

);

})();


assert.rejects(

Promise.reject(new Error('錯誤信息')),

Error).then(() => {

// ...

});

注意,error?不能是字符串。 如果第二個參數(shù)是字符串约急,則視為不傳入?error,且字符串會用于?message苗分。 這可能會造成誤解厌蔽。 如果需要使用字符串作為第二個參數(shù),請仔細閱讀?assert.throws()?中的例子摔癣。

assert.strictEqual(actual,expected{,message])


使用?SameValue比較法測試?actual?參數(shù)與?expected?參數(shù)是否全等奴饮。

const assert = require('assert').strict;

assert.strictEqual(1, 2);

// 拋出 AssertionError [ERR_ASSERTION]: Input A expected to strictly equal input B:

// + expected - actual

// - 1

// + 2

assert.strictEqual(1, 1);

// 測試通過。

assert.strictEqual(1, '1');

// 拋出 AssertionError [ERR_ASSERTION]: Input A expected to strictly equal input B:

// +

expected - actual

// - 1

// + '1'

如果兩個值不全等择浊,則拋出一個帶有?message?屬性的?AssertionError戴卜,其中?message?屬性的值等于傳入的?message?參數(shù)的值。 如果?message?參數(shù)為?undefined琢岩,則賦予默認的錯誤信息投剥。 如果?message?參數(shù)是?Error?的實例,則會拋出它而不是?AssertionError担孔。

assert.throws(block[,error][,message])


斷言?block?函數(shù)會拋出錯誤江锨。

error?可以是?ClassRegExp糕篇、校驗函數(shù)啄育、每個屬性都會被測試是否深度全等的校驗對象、或每個屬性(包括不可枚舉的?message?和?name?屬性)都會被測試是否深度全等的錯誤實例拌消。 當使用對象時挑豌,可以使用正則表達式來校驗字符串屬性。 詳見下面的例子墩崩。

如果指定了?message?參數(shù)氓英,則當?block?函數(shù)不拋出錯誤時,message?參數(shù)會作為?AssertionError?的錯誤信息泰鸡。

例子债蓝,error?參數(shù)為自定義的校驗對象或錯誤實例:

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' }

// 注意,只有校驗對象的屬性會被測試盛龄。

// 使用嵌套的對象必須提供全部屬性饰迹,否則校驗會失敗。

});

// 使用正則表達式來校驗錯誤屬性:

assert.throws(

() => {

throw err;

},

{

// `name` 和 `message` 屬性為字符串余舶,對它們使用正則表達式進行匹配啊鸭。

// 如果校驗失敗,則拋出錯誤匿值。

name: /^TypeError$/,

message: /錯誤信息/,

foo: 'bar',

info: {

nested: true,

// 嵌套的屬性不可以使用正則表達式赠制!

baz: 'text' },

// `reg` 屬性包含了一個正則表達式,只有校驗對象也包含一個完全相同的正則表達式時,校驗才會通過钟些。

reg: /abc/i

});

// 失敗烟号,因為 `message` 屬性與 `name` 屬性不同:

assert.throws(

() => {

const otherErr = new Error('未找到');

otherErr.code = 404;

throw otherErr;

},

err // 會測試 `message`、`name` 和 `code`政恍。

);

例子汪拥,error?參數(shù)為構造函數(shù):

assert.throws(

() => {

throw new Error('錯誤信息');

},

Error );

例子,error?參數(shù)為?RegExp

使用正則表達式運行錯誤對象的?.toString篙耗, 且包括錯誤的名稱

assert.throws(

() => {

throw new Error('錯誤信息');

},

/^Error: 錯誤信息$/

);

例子迫筑,error?參數(shù)為自定義函數(shù):

assert.throws(

() => {

throw new Error('錯誤信息');

}, function(err) {

if ((err instanceof Error) && /錯誤/.test(err)) {

return true;

}

},

'不是期望的錯誤' );

注意,error?不能是字符串宗弯。 如果第二個參數(shù)是字符串脯燃,則視為不傳入?error,且字符串會用于?message蒙保。 這可能會造成誤解辕棚。 使用與拋出的錯誤信息相同的信息,會導致?ERR_AMBIGUOUS_ARGUMENT?錯誤追他。 如果需要使用字符串作為第二個參數(shù)坟募,請仔細閱讀下面的例子。

function throwingFirst() {

throw new Error('錯誤一');

}

function throwingSecond() {

throw new Error('錯誤二');

}

function notThrowing() {}

// 第二個參數(shù)為字符串邑狸,且輸入函數(shù)拋出了錯誤懈糯。

// 第一個例子不會拋出錯誤,因為它沒有匹配到輸入函數(shù)拋出的錯誤信息单雾!

assert.throws(throwingFirst, '錯誤二');

// 第二個例子中赚哗,傳入的信息接近錯誤信息,

// 且沒有表述清楚用戶是否有意匹配錯誤信息硅堆,

// 所以 Node.js 會拋出 `ERR_AMBIGUOUS_ARGUMENT` 錯誤屿储。

assert.throws(throwingSecond, '錯誤二');

// 拋出錯誤:

// TypeError [ERR_AMBIGUOUS_ARGUMENT]

// 當函數(shù)沒有拋出錯誤時,字符串可用于錯誤信息:

assert.throws(notThrowing, '錯誤二');

// 拋出 AssertionError [ERR_ASSERTION]: Missing expected exception: 錯誤二

// 如果想要匹配到錯誤信息渐逃,可以如下:

assert.throws(throwingSecond, /錯誤二$/);

// 沒有拋出錯誤够掠,因為錯誤信息匹配。

assert.throws(throwingFirst, /錯誤二$/);

// 拋出錯誤:

// Error: 錯誤一

// at throwingFirst (repl:2:9)

鑒于會混淆語句茄菊,建議不要使用字符串作為第二個參數(shù)疯潭。 這可能會導致不易定位的錯誤。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末面殖,一起剝皮案震驚了整個濱河市竖哩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脊僚,老刑警劉巖相叁,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡增淹,警方通過查閱死者的電腦和手機椿访,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埠通,“玉大人赎离,你說我怎么就攤上這事《巳瑁” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵虽画,是天一觀的道長舞蔽。 經常有香客問我,道長码撰,這世上最難降的妖魔是什么渗柿? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮脖岛,結果婚禮上朵栖,老公的妹妹穿的比我還像新娘。我一直安慰自己柴梆,他們只是感情好陨溅,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绍在,像睡著了一般门扇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上偿渡,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天臼寄,我揣著相機與錄音,去河邊找鬼溜宽。 笑死吉拳,一個胖子當著我的面吹牛,可吹牛的內容都是我干的适揉。 我是一名探鬼主播留攒,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涡扼!你這毒婦竟也來了稼跳?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吃沪,失蹤者是張志新(化名)和其女友劉穎汤善,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡红淡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年不狮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片在旱。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡摇零,死狀恐怖,靈堂內的尸體忽然破棺而出桶蝎,到底是詐尸還是另有隱情驻仅,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布登渣,位于F島的核電站噪服,受9級特大地震影響,放射性物質發(fā)生泄漏胜茧。R本人自食惡果不足惜粘优,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呻顽。 院中可真熱鬧雹顺,春花似錦、人聲如沸廊遍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昧碉。三九已至英染,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間被饿,已是汗流浹背四康。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狭握,地道東北人闪金。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像论颅,于是被迫代替她去往敵國和親哎垦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容