学习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 相关文章推荐
javascript while语句和do while语句的区别分析
Dec 08 Javascript
js Event对象的5种坐标
Sep 12 Javascript
对frameset、frame、iframe的js操作示例代码
Aug 16 Javascript
JS解析XML实例分析
Jan 30 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
Oct 15 Javascript
jquery背景跟随鼠标滑动导航
Nov 20 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
Jun 13 Javascript
最棒的Angular2表格控件
Aug 10 Javascript
JS使用插件cryptojs进行加密解密数据实例
May 11 Javascript
angular4 JavaScript内存溢出问题
Mar 06 Javascript
JavaScript常见JSON操作实例分析
Aug 08 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
Aug 04 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数组的教程详解
2013/06/05 PHP
PHP多维数组遍历方法(2种实现方法)
2015/12/10 PHP
学习YUI.Ext 第三天
2007/03/10 Javascript
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
跟着JQuery API学Jquery 之三 筛选
2010/04/09 Javascript
基于jQuery的倒计时实现代码
2012/05/30 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
基于JavaScript实现活动倒计时效果
2017/04/20 Javascript
JavaScript正则表达式简单实用实例
2017/06/23 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
简单了解JS打开url的方法
2020/02/21 Javascript
Python将多个excel文件合并为一个文件
2018/01/03 Python
python3利用tcp实现文件夹远程传输
2018/07/28 Python
使用python将图片格式转换为ico格式的示例
2018/10/22 Python
Python Django 命名空间模式的实现
2019/08/09 Python
Python使用tkinter模块实现推箱子游戏
2019/10/08 Python
PyTorch的torch.cat用法
2020/06/28 Python
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
大学自我评价
2014/02/12 职场文书
应届生自荐信范文
2014/02/21 职场文书
大学学习计划书范文
2014/05/02 职场文书
学习十八大的心得体会
2014/09/01 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/09/30 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
小学推普周活动总结
2015/05/07 职场文书
死亡诗社观后感
2015/06/05 职场文书
2015年大学迎新晚会总结
2015/07/16 职场文书
礼貌问候语大全
2015/11/10 职场文书
Python selenium的这三种等待方式一定要会!
2021/06/10 Python
Win10此设备不支持接收Miracast无法投影的解决方法
2022/07/07 数码科技