学习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 相关文章推荐
Extjs407 getValue()和getRawValue()区别介绍
May 21 Javascript
JS文本框默认值处理详解
Jul 10 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
Nov 27 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
Sep 16 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
Nov 25 Javascript
jQuery基于ID调用指定iframe页面内的方法
Jul 06 Javascript
angularjs 表单密码验证自定义指令实现代码
Oct 27 Javascript
javascript DOM的详解及实例代码
Mar 06 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
Sep 20 Javascript
基于Vue开发数字输入框组件
Dec 19 Javascript
webpack优化的深入理解
Dec 10 Javascript
在vue项目实现一个ctrl+f的搜索功能
Feb 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中的错误处理、异常处理机制分析
2012/05/07 PHP
关于PHP session 存储方式的详细介绍
2013/06/25 PHP
php实现水仙花数的4个示例分享
2014/04/08 PHP
PHP面相对象中的重载与重写
2017/02/13 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
php常用的工具开发整理
2019/09/26 PHP
PHP文件打开关闭及读写操作示例解析
2020/08/06 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
2013/08/29 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
Jquery使用val方法读写value值
2015/05/18 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
2016/07/01 Javascript
jQuery弹出层后禁用底部滚动条(移动端关闭回到原位置)
2016/08/29 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
JavaScript基本类型值-Undefined、Null、Boolean
2017/02/23 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
深入理解Angular中的依赖注入
2017/06/26 Javascript
js学使用setTimeout实现轮循动画
2017/07/17 Javascript
React项目动态设置title标题的方法示例
2018/09/26 Javascript
使用jquery Ajax实现上传附件功能
2018/10/23 jQuery
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
解决layui使用layui-icon出现默认图标的问题
2019/09/11 Javascript
es6中Promise 对象基本功能与用法实例分析
2020/02/23 Javascript
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
Sephora丝芙兰澳洲官方网站:国际知名化妆品购物
2016/10/27 全球购物
党课学习思想汇报
2014/01/02 职场文书
程序员求职信
2014/04/16 职场文书
保密工作目标责任书
2014/07/28 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
Python制作一个随机抽奖小工具的实现
2021/07/07 Python
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android