学习node.js 断言的使用

assert模块提供了一组简单的断言测试,分严格模式(strict)和遗留模式(legacy),严格模式下,对比的方式比较严格,好比说,0与'0'比较,会报错,但在遗留模式下是能够经过的。官方推荐使用严格模式, 因此本文基于strict模式下学习。git

如何使用严格模式

const assert = require('assert').strict; // 严格模式

assert.equal(0, '0') // error

全局使用strict模式后,assert.equal()assert.strictEqual()的效果是同样的。
若是不想全局使用的话,能够直接使用带strict的方法。github

const assert = require('assert') // 遗留模式

assert.equal(0, '0') // success
assert.strictEqual(0, '0') // error

assert.AssertionError

Error的子类,表示断言失败,assert模块抛出的错误都是AssertionError的实例。正则表达式

相似于下面这个class,实际上的AssertionError是由ES5写的,下面这个只是方便理解传入的参数promise

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是否为真值。
若是不为真值,抛出属性messagemessage参数值的AssertionError,若是未定义,为默认错误信息。
若是是Error的实例,则抛出Error实例。(如下关于message的使用都同样)async

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参数之间的深度严格不相等性,深度比较意味着子对象的可枚举的自身属性也经过如下规则进行递归计算。ui

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参数时,这颇有用。

相关文章
相关标签/搜索