学习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 相关文章推荐
IE bug table元素的innerHTML
Jan 11 Javascript
JavaScript 保存数组到Cookie的代码
Apr 14 Javascript
js实现图片轮换效果代码
Apr 16 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
Sep 10 Javascript
简单的JavaScript互斥锁分享
Feb 02 Javascript
JavaScript中的立即执行函数表达式介绍
Mar 15 Javascript
Node.js的Koa框架上手及MySQL操作指南
Jun 13 Javascript
基于VUE选择上传图片并页面显示(图片可删除)
May 25 Javascript
微信小程序form表单组件示例代码
Jul 15 Javascript
如何为vuex实现带参数的 getter和state.commit
Jan 04 Javascript
JS实现多选框的操作
Jun 24 Javascript
使用Canvas绘制一个游戏人物属性图
Mar 25 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的access操作类
2008/04/09 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
jquery下div 的resize事件示例代码
2014/03/09 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
jQuery晃动层特效实现方法
2015/03/09 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
MVC+jQuery.Ajax异步实现增删改查和分页
2020/12/22 Javascript
jQuery前端开发35个小技巧
2016/05/24 Javascript
jQuery插件扩展操作入门示例
2017/01/16 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
webpack file-loader和url-loader的区别
2019/01/15 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
python实现的一个p2p文件传输实例
2014/06/04 Python
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
2019/05/23 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
澳大利亚优质的家居用品和生活方式公司:Bed Bath N’ Table
2019/04/16 全球购物
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
体育教师自我鉴定
2014/02/12 职场文书
英语一分钟演讲稿
2014/04/29 职场文书
自动化专业毕业生求职信
2014/06/18 职场文书
表扬稿表扬信的格式及范文
2019/06/24 职场文书
MySQL数据库压缩版本安装与配置详细教程
2021/05/21 MySQL
python 实现两个变量值进行交换的n种操作
2021/06/02 Python
Python采集爬取京东商品信息和评论并存入MySQL
2022/04/12 Python
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL