学习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 相关文章推荐
使用prototype.js进行异步操作
Feb 07 Javascript
用js实现随机返回数组的一个元素
Aug 13 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
May 15 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
May 16 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
Jun 13 Javascript
使用window.prompt()实现弹出用户输入的对话框
Apr 13 Javascript
微信小程序的分类页面制作
Jun 27 Javascript
浅谈angular2子组件的事件传递(任意组件事件传递)
Sep 30 Javascript
Vuex的初探与实战小结
Nov 26 Javascript
jquery拖拽自动排序插件使用方法详解
Jul 20 jQuery
简单两步使用node发送qq邮件的方法
Mar 01 Javascript
jQuery/JS监听input输入框值变化实例
Oct 17 jQuery
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
常用星际术语索引(新手指南)
2020/03/04 星际争霸
php解析url的三个示例
2014/01/20 PHP
php类常量用法实例分析
2015/07/09 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
PHP笛卡尔积实现算法示例
2018/07/30 PHP
jquery html动态生成select标签出问题的解决方法
2013/11/20 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
Javascript 实现复制(Copy)动作方法大全
2014/06/20 Javascript
javascript模拟post提交隐藏地址栏的参数
2014/09/03 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
javascript中递归的两种写法
2017/01/17 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
运用js实现图层拖拽的功能
2019/05/24 Javascript
微信小程序实现下拉刷新动画
2019/06/21 Javascript
解决Antd 里面的select 选择框联动触发的问题
2020/10/24 Javascript
Python程序语言快速上手教程
2012/07/18 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
python3 实现的对象与json相互转换操作示例
2019/08/17 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
Python sklearn中的.fit与.predict的用法说明
2020/06/28 Python
python 如何调用远程接口
2020/09/11 Python
CSS3实现红包抖动效果
2020/12/23 HTML / CSS
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
Ibatis的核心配置文件都有什么
2014/09/08 面试题
执行总经理岗位职责
2014/02/03 职场文书
《藏戏》教学反思
2014/02/11 职场文书
小学生学雷锋演讲稿
2014/04/25 职场文书
政治表现评语
2014/05/04 职场文书
副处级干部考察材料
2014/05/17 职场文书
邀请函范文
2015/02/02 职场文书
工作犯错保证书
2015/05/11 职场文书
2015年城乡环境综合治理工作总结
2015/07/24 职场文书
导游词之西安骊山
2019/12/20 职场文书