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?可以是?Class、RegExp?或校驗函數(shù)
assert.doesNotThrow(block[, error][, message])
斷言?block?函數(shù)不會拋出錯誤翻具。
當?assert.doesNotThrow()?被調用時履怯,它會立即調用?block?函數(shù)。
如果拋出錯誤且錯誤類型與?error?參數(shù)指定的相同裆泳,則拋出?AssertionError叹洲。 如果錯誤類型不相同,或?error?參數(shù)為?undefined工禾,則拋出錯誤运提。
error?可以是?Class、RegExp?或校驗函數(shù)闻葵。
assert.equal(actual,expected[,message])
strict 模式
如果值不相等民泵,則用與消息參數(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?可以是?Class、RegExp糕篇、校驗函數(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ù)疯潭。 這可能會導致不易定位的錯誤。