学习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 相关文章推荐
img标签中onerror用法
Aug 13 Javascript
用方法封装javascript的new操作符(一)
Dec 25 Javascript
Javascript字符串对象的常用方法简明版
Jun 26 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
Jul 28 Javascript
jquery删除数组中重复元素
Dec 05 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
Sep 27 Javascript
Vue项目路由刷新的实现代码
Apr 17 Javascript
Vue实现微信支付功能遇到的坑
Jun 05 Javascript
jQuery zTree插件使用简单教程
Aug 16 jQuery
基于Vue sessionStorage实现保留搜索框搜索内容
Jun 01 Javascript
node.js通过url读取文件
Oct 16 Javascript
React + Threejs + Swiper 实现全景图效果的完整代码
Jun 28 Javascript
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 Array交叉表实现代码
2010/08/05 PHP
php中通过curl smtp发送邮件
2012/06/05 PHP
php动态变量定义及使用
2015/06/10 PHP
JavaScript Sort 表格排序
2009/10/31 Javascript
JavaScript判断窗口是否最小化的代码(跨浏览器)
2010/08/01 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
JavaScript为事件句柄绑定监听函数实例详解
2015/12/15 Javascript
javascript中不易分清的slice,splice和split三个函数
2016/03/29 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
jQuery实现遮罩层登录对话框
2016/12/29 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
详解Vue、element-ui、axios实现省市区三级联动
2019/05/07 Javascript
Electron-vue开发的客户端支付收款工具的实现
2019/05/24 Javascript
jquery实现直播视频弹幕效果
2020/02/25 jQuery
python利用拉链法实现字典方法示例
2017/03/25 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
python远程邮件控制电脑升级版
2019/05/23 Python
python二进制文件的转译详解
2019/07/03 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
python实现扫雷游戏的示例
2020/10/20 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
美国最大的团购网站:Groupon
2016/07/23 全球购物
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
香港家用健身器材、运动器材及健康美容仪器专门店:FitBoxx
2019/12/05 全球购物
美国健康和保健平台:healtop
2020/07/02 全球购物
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
四风个人对照检查材料思想汇报
2014/09/25 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
2015年基层党建工作总结
2015/05/14 职场文书
庆七一活动简报
2015/07/20 职场文书
python - asyncio异步编程
2021/04/06 Python
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL