乐趣区

学习node.js 断言的使用

assert 模块提供了一组简单的断言测试,分严格模式 (strict) 和遗留模式(legacy),严格模式下,对比的方式比较严格,比如说,0 与 ’0’ 比较,会报错,但在遗留模式下是可以通过的。官方推荐使用严格模式, 所以本文基于 strict 模式下学习。
如何使用严格模式
const assert = require(‘assert’).strict; // 严格模式

assert.equal(0, ‘0’) // error
全局使用 strict 模式后,assert.equal() 与 assert.strictEqual()的效果是一样的。如果不想全局使用的话,可以直接使用带 strict 的方法。
const assert = require(‘assert’) // 遗留模式

assert.equal(0, ‘0’) // success
assert.strictEqual(0, ‘0’) // error
assert.AssertionError
Error 的子类,表示断言失败,assert 模块抛出的错误都是 AssertionError 的实例。
类似于下面这个 class,实际上的 AssertionError 是由 ES5 写的,下面这个只是方便理解传入的参数
interface IOptions {
message?: string; // 设置错误的信息
actual?: any; // 设置错误实例上的实际值
expected?: any; // 设置错误实例上的期望值
operator?: string; // 设置用于比较的操作或触发错误的断言函数
stackStartFn(): any; // 生成的堆栈跟踪将移除所有帧直到提供的函数
}

class AssertionError extends Error {
constructor(options: IOptions) {
// …
}
}
assert(value: any, message?: string | Error)
检测是否为真值,是 assert.ok 的别名。
assert.ok(value: any, message?: string | Error)
检测 value 是否为真值。如果不为真值,抛出属性 message 为 message 参数值的 AssertionError,如果未定义,为默认错误信息。如果是 Error 的实例,则抛出 Error 实例。(以下关于 message 的使用都一样)
assert.strictEqual(actual: any, expected: any, message?: string | Error)
检测 actual 参数和 expected 参数之间的严格相等性,使用 sameValue 比较。
assert.deepStrictEqual(actual: any, expected: any, message?: string | Error)
检测 actual 参数和 expected 参数之间的深度严格相等性,深度比较意味着子对象的可枚举的自身属性也通过以下规则进行递归计算。
assert.notStrictEqual(actual: any, expected: any, message?: string | Error)
检测 actual 参数和 expected 参数之间的严格不相等性,使用 sameValue 比较。
assert.notDeepStrictEqual(actual: any, expected: any, message?: string | Error)
检测 actual 参数和 expected 参数之间的深度严格不相等性,深度比较意味着子对象的可枚举的自身属性也通过以下规则进行递归计算。
assert.fail(message?: string | Error = ‘failed’)
使用提供的错误消息或默认错误消息抛出 AssertionError。
assert.throws(fn: function, error?: regExp | function | object | Error, message?: string)
检测 fn 函数抛出的错误是否与预期的错误 error 一样。
fn 为一个会抛出错误的函数
error 可以为多种类型,作为与抛出的错误对比的样本。
为 regExp 时,可以匹配抛出的错误。
assert.throws(() => {
throw new Error(‘it is a error’)
}, /^Error: it is a error$/);
为 function 时,可以自定义验证函数
assert.throws(() => {
throw new Error(‘it is a error’)
}, (err) => {
if ((err instanceof Error) && /error/.test(err)) {
return true;
}
});
为 object 时,将仅测试验证对象 error 上的属性。
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’
// 使用嵌套对象需要存在所有属性。
// 否则验证将失败。
// 无法对嵌套属性使用正则表达式!
}
});
为 Error 时,用 instanceof 检测是否是该实例。
注意,error 不能是字符串。如果提供了一个字符串作为第二个参数,则假定 error 被忽略,而字符串将用于 message。
assert.reject(asyncFn: function | promise, error?: regExp | function | object | Error, message?: string)
assert.throws 的异步版本。
asyncFn 为一个 function 时
立即执行该函数,如果该函数不返回 promise,则返回一个被拒绝 (reject) 的 Promise。如果该函数同步抛出一个错误,返回一个带有该错误的被拒绝的 Promise。
asyncFn 为一个 Promise 时
等待 Promise 执行,检测是否被拒绝。
assert.ifError(value: any)
如果 value 不为 null 或者 undefined 就将 value 作为错误抛出。在回调中测试 error 参数时,这很有用。

退出移动版