assert模塊提供了斷言測試的函數(shù),用于測試不變式
有strict和legacy兩種模式,建議只使用strict模式
assert.AssertionError類
error的一個子類,表明斷言的失敗。assert模塊跑出的所有錯誤都是AssertionError類的實例
strict模式
當使用strict模式時,任何assert函數(shù)都會使用嚴格函數(shù)模式的等式,所以assert.deepEqual()會等同于assert.deepStrictEqual()
除此以外,涉及對象的錯誤信息會產(chǎn)生一個錯誤差異比較,而不是展示對方的對象,legacy模式則不會這樣
assert(value[,message])
ssert.ok()?的別名。
assert.deepEqual(actual,expected[,message])
strict 模式
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ù),則立即調(diào)用該函數(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()?被調(diào)用時,它會立即調(diào)用?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。 可用于測試回調(diào)函數(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。 如果沒有傳入?yún)?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ù),則立即調(diào)用該函數(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ù)為構(gòu)造函數(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ù)。 這可能會導致不易定位的錯誤。