穩定級別:3 - 鎖定html
斷言模塊提供了一個簡單斷言集,用於測試不變量。本模塊本來是Node.js的內部使用,但也能夠經過require('assert')
在應用中使用。可是要注意,斷言模塊並非一個測試框架,也不是一個通用的斷言庫。node
斷言模塊的API已經鎖定。意味着在將來,本模塊應用和暴露的方法都不會有任何修改或者增長。git
v0.5.9版本加入github
是assert.ok()的alias。正則表達式
const assert = require('assert'); assert(true); // OK assert(1); // OK assert(false); // throws "AssertionError: false == true" assert(0); // throws "AssertionError: 0 == true" assert(false, 'it\'s false'); // throws "AssertionError: it's false"
v0.1.21版本加入api
用於測試 actual
和expected
的深等於。基本數據類型的值將會用等價運算符( ==
)做比較。框架
本方法只適用於可枚舉且返回自身的屬性。 deepEqual()
不能用於測試對象原型、附加符號、不可枚舉的屬性。這一點可能會致使一些意想不到的結果。好比,下面的例子不會拋出AssertionError
,由於Error對象的屬性是不可枚舉的。ide
// WARNING: This does not throw an AssertionError! assert.deepEqual(Error('a'), Error('b'));
」深」等於意味着:傳入對象的子對象的可枚舉且返回自身的屬性也會被比較:函數
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(obj1, obj1); // OK, 一個對象和自身確定是相等的 assert.deepEqual(obj1, obj2); // AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } } // b的值不一樣 assert.deepEqual(obj1, obj3); // OK, 兩個對象是相等的 assert.deepEqual(obj1, obj4); // AssertionError: { a: { b: 1 } } deepEqual {} // 對象原型不能用於比較
若是傳入的兩個參數不相等,將會拋出一個AssertionError
,它會自帶一個message
屬性,可由message
傳參設置。若是message
傳參是undefined,就會給它賦值一個默認的錯誤信息。oop
v1.2.0版本加入
與assert.deepEqual()
只有兩個區別。第一,基本數據類型的值是用強等價運算符(===
)來比較的。第二,對象之間的比較要求它們的原型(prototype)也一致。
若是傳入的兩個參數不相等,將會拋出一個AssertionError
,它會自帶一個message
屬性,可由message
傳參設置。若是message
傳參是undefined,就會給它賦值一個默認的錯誤信息。
v0.1.21版本加入
斷言block
方法不會拋出錯誤,關於拋出(throw)可參加assert.throw()瞭解更多細節。
當assert.doesNotThrow()
被調用的時候,它會當即調用block
方法。
若是有錯誤拋出,而且錯誤類型與傳參中的錯誤類型一致,此方法將拋出一個AssertionError
。若是錯誤類型不一致,或者傳參error
未定義,那麼錯誤會被回傳給調用者。
好比下例中,將會拋出一個TypeError
,由於錯誤類型不一致。
assert.doesNotThrow( () => { throw new TypeError('Wrong value'); }, SyntaxError );
但下例中就會拋出AssertionError
並附帶message
「Got unwanted exception (TypeError)..」。
assert.doesNotThrow( () => { throw new TypeError('Wrong value'); }, TypeError );
當有AssertionError
拋出的時候,若是傳參中定義了message
參數,那麼它將會被附到AssertionError
的message
後面。
assert.doesNotThrow( () => { throw new TypeError('Wrong value'); }, TypeError, 'Whoops' ); // Throws: AssertionError: Got unwanted exception (TypeError). Whoops
v0.1.21版本加入
用等價運算符(==
)比較actual
和expected
的淺等於。
const assert = require('assert'); assert.equal(1, 1); // OK, 1 == 1 assert.equal(1, '1'); // OK, 1 == '1' assert.equal(1, 2); // AssertionError: 1 == 2 assert.equal({a: {b: 1}}, {a: {b: 1}}); //AssertionError: { a: { b: 1 } } == { a: { b: 1 } }
若是傳入的兩個參數不相等,將會拋出一個AssertionError
,它會自帶一個message
屬性,可由message
傳參設置。若是message
傳參是undefined,就會給它賦值一個默認的錯誤信息。
v0.1.21版本加入
拋出AssertionError
。若是message
也就是比較結果爲假,那麼錯誤信息輸出actual
和expected
的值,用傳入的運算符隔開;若是結果爲真,錯誤信息輸出傳入的message
。
const assert = require('assert'); assert.fail(1, 2, undefined, '>'); // AssertionError: 1 > 2 assert.fail(1, 2, 'whoops', '>'); // AssertionError: whoops
v0.1.97版本加入
若是value
爲真則輸出value
值。適合用於測試回調方法中的error
參數。
const assert = require('assert'); assert.ifError(0); // OK assert.ifError(1); // Throws 1 assert.ifError('error'); // Throws 'error' assert.ifError(new Error()); // Throws Error
v0.1.21版本加入
測試深不等,與assert.deepEqual()
對立。
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, obj1 and obj2 are not deeply equal assert.notDeepEqual(obj1, obj3); // AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } } assert.notDeepEqual(obj1, obj4); // OK, obj1 and obj2 are not deeply equal
若是傳入的兩個參數深相等,將會拋出一個AssertionError
,它會自帶一個message
屬性,可由message
傳參設置。若是message
傳參是undefined,就會給它賦值一個默認的錯誤信息。
v1.2.0版本加入
測試深且強不等,與assert.deepStrictEqual()對立。
const assert = require('assert'); assert.notDeepEqual({a:1}, {a:'1'}); // AssertionError: { a: 1 } notDeepEqual { a: '1' } assert.notDeepStrictEqual({a:1}, {a:'1'}); // OK
若是傳入的兩個參數深且強相等,將會拋出一個AssertionError
,它會自帶一個message
屬性,可由message
傳參設置。若是message
傳參是undefined,就會給它賦值一個默認的錯誤信息。
v0.1.21版本加入
用不等價運算符(!=
)測試淺不等。
const assert = require('assert'); assert.notEqual(1, 2); // OK assert.notEqual(1, 1); // AssertionError: 1 != 1 assert.notEqual(1, '1'); // AssertionError: 1 != '1'
若是傳入的兩個參數淺相等,將會拋出一個AssertionError
,它會自帶一個message
屬性,可由message
傳參設置。若是message
傳參是undefined,就會給它賦值一個默認的錯誤信息。
v0.1.21版本加入
用強不等運算符(!==
)測試強不等。
const assert = require('assert'); assert.notStrictEqual(1, 2); // OK assert.notStrictEqual(1, 1); // AssertionError: 1 != 1 assert.notStrictEqual(1, '1'); // OK
若是傳入的兩個參數強等,將會拋出一個AssertionError
,它會自帶一個message
屬性,可由message
傳參設置。若是message
傳參是undefined,就會給它賦值一個默認的錯誤信息。
v0.1.21版本加入
測試value
是否爲真。其實與assert.equal(!!value, true, message)
等價。
若是value
不爲真,拋出AssertionError
,附帶message
信息與傳入message
一致。若是message
傳參是undefined,就會給它賦值一個默認的錯誤信息。
const assert = require('assert'); assert.ok(true); // OK assert.ok(1); // OK assert.ok(false); // throws "AssertionError: false == true" assert.ok(0); // throws "AssertionError: 0 == true" assert.ok(false, 'it\'s false'); // throws "AssertionError: it's false"
v0.1.21版本加入
用強等運算符(===
)測試傳參是否強等於。
const assert = require('assert'); assert.strictEqual(1, 2); // AssertionError: 1 === 2 assert.strictEqual(1, 1); // OK assert.strictEqual(1, '1'); // AssertionError: 1 === '1'
若是傳入的兩個參數不是強等,將會拋出一個AssertionError
,它會自帶一個message
屬性,可由message
傳參設置。若是message
傳參是undefined,就會給它賦值一個默認的錯誤信息。
v0.1.21版本加入
指望block
方法拋出錯誤。
若是傳入自定義error
,能夠是構造函數、正則表達式或驗證函數。
若是傳入message
但沒有錯誤拋出,message
將是AssertionError
附帶的。
用構造函數驗證明例:
assert.throws( () => { throw new Error('Wrong value'); }, Error );
用正則表達式驗證error:
assert.throws( () => { throw new Error('Wrong value'); }, /value/ );
自定義error驗證:
assert.throws( () => { throw new Error('Wrong value'); }, function(err) { if ( (err instanceof Error) && /value/.test(err) ) { return true; } }, 'unexpected error' );
請注意error
參數能夠爲字符串。若是第二個傳參是個字符串,那麼error
參數將會被忽略,直接用這個字符串做爲輸出的message
。但這可能會致使很容易被忽略的問題:
// THIS IS A MISTAKE! DO NOT DO THIS! assert.throws(myFunction, 'missing foo', 'did not throw with expected message'); // Do this instead. assert.throws(myFunction, /missing foo/, 'did not throw with expected message');
請查看:全文目錄