学习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 相关文章推荐
基于jquery的仿百度的鼠标移入图片抖动效果
Sep 17 Javascript
js 数据类型转换总结笔记
Jan 17 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
Mar 04 Javascript
JavaScript 数组详解
Oct 10 Javascript
javascript打印html内容功能的方法示例
Nov 28 Javascript
javascript得到当前页的来路即前一页地址的方法
Feb 18 Javascript
jquery彩色投票进度条简单实例演示
Jul 23 Javascript
JS实现标签页切换效果
May 04 Javascript
JavaScript通过filereader接口读取文件
May 10 Javascript
利用VS Code开发你的第一个AngularJS 2应用程序
Dec 15 Javascript
Vue实现的父组件向子组件传值功能示例
Jan 19 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
Mar 12 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
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
基于jquery的无限级联下拉框js插件
2011/10/29 Javascript
jquery 触发a链接点击事件解决方案
2013/05/02 Javascript
手机平板等移动端适配跳转URL的js代码
2014/01/25 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
2016/01/22 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
Web安全测试之XSS实例讲解
2016/08/15 Javascript
jQuery实现可拖拽3D万花筒旋转特效
2017/01/03 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
ios中视频的最后一桢问题解决
2019/05/14 Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
2019/05/18 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
python多进程实现进程间通信实例
2017/11/24 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
Python二进制串转换为通用字符串的方法
2018/07/23 Python
Django model反向关联名称的方法
2018/12/15 Python
python opencv摄像头的简单应用
2019/06/06 Python
python爬虫要用到的库总结
2020/07/28 Python
新加坡领先的时尚生活方式零售品牌:CHARLES & KEITH
2018/01/16 全球购物
PyQt QMainWindow的使用示例
2021/03/24 Python
建筑工程技术应届生求职信
2013/11/17 职场文书
应届毕业生求职信
2013/11/30 职场文书
总结表彰大会主持词
2014/03/26 职场文书
大学活动总结格式
2014/04/29 职场文书
财务审计整改报告
2014/11/06 职场文书
导游词之介休绵山
2019/12/31 职场文书
Python可变集合和不可变集合的构造方法大全
2021/12/06 Python
教你win10系统中APPCRASH事件问题解决方法
2022/07/15 数码科技