进修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是不是为真值。
假如不为真值,抛出属性messagemessage参数值的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参数时,这很有效。

    原文作者:WiessWong
    原文地址: https://segmentfault.com/a/1190000018489139
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞