当前位置:首页 >> 网络编程

学习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"htmlcode">
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参数时,这很有用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。