学习node.js 断言的使用详解


Posted in Javascript onMarch 18, 2019

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

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

Javascript 相关文章推荐
Mozilla中显示textarea中选择的文字
Sep 07 Javascript
ASP.NET jQuery 实例17 通过使用jQuery validation插件校验ListBox
Feb 03 Javascript
js实现大转盘抽奖游戏实例
Jun 24 Javascript
JavaScript的代码编写格式规范指南
Dec 07 Javascript
js+canvas绘制矩形的方法
Jan 28 Javascript
js仿3366小游戏选字游戏
Apr 14 Javascript
Angular.js中$apply()和$digest()的深入理解
Oct 13 Javascript
javascript 中模板方法单例的实现方法
Oct 17 Javascript
vue 实现购物车总价计算
Nov 06 Javascript
vue.js实现照片放大功能
Jun 23 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
Aug 07 Javascript
vue在图片上传的时候压缩图片
Nov 18 Vue.js
React 使用Hooks简化受控组件的状态绑定
Mar 18 #Javascript
JavaScript显式数据类型转换详解
Mar 18 #Javascript
浅谈js中的bind
Mar 18 #Javascript
node微信开发之获取access_token+自定义菜单
Mar 17 #Javascript
JavaScript中this用法学习笔记
Mar 17 #Javascript
通过JavaScript下载文件到本地的方法(单文件)
Mar 17 #Javascript
微信小程序登录session的使用
Mar 17 #Javascript
You might like
php-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
PHP获取MAC地址的函数代码
2011/09/11 PHP
CodeIgniter模板引擎使用实例
2014/07/15 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
2014/08/15 Javascript
JavaScript对表格或元素按文本,数字或日期排序的方法
2015/05/26 Javascript
jQuery超简单选项卡完整实例
2015/09/26 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
在一个页面实现两个zTree联动的方法
2017/12/20 Javascript
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
[40:03]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
Python正则表达式匹配中文用法示例
2017/01/17 Python
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
Python获取当前页面内所有链接的四种方法对比分析
2017/08/19 Python
Python实现购物车功能的方法分析
2017/11/10 Python
对python中Json与object转化的方法详解
2018/12/31 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
pytorch实现从本地加载 .pth 格式模型
2020/02/14 Python
详解python环境安装selenium和手动下载安装selenium的方法
2020/03/17 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
曼城官方网上商店:Manchester City
2019/09/10 全球购物
匡威西班牙官网:Converse西班牙
2019/10/01 全球购物
学生就业推荐信
2013/11/13 职场文书
机关财务管理制度
2014/01/17 职场文书
房产分割协议书范文
2014/11/21 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电
Golang连接并操作MySQL
2022/04/14 MySQL