学习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使用val方法读写value值
May 18 Javascript
理解Javascript的动态语言特性
Jun 17 Javascript
使用jquery实现仿百度自动补全特效
Jul 23 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
Jan 23 Javascript
js基于cookie方式记住返回页面用法示例
May 27 Javascript
浅析Javascript的自动分号插入(ASI)机制
Sep 29 Javascript
用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
Nov 09 Javascript
利用vue写todolist单页应用
Dec 15 Javascript
详解vue前后台数据交互vue-resource文档
Jul 19 Javascript
你应该知道的几类npm依赖包管理详解
Oct 06 Javascript
Vue实现微信支付功能遇到的坑
Jun 05 Javascript
react用Redux中央仓库实现一个todolist
Sep 29 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
header跳转和include包含问题详解
2012/09/08 PHP
深入php-fpm的两种进程管理模式详解
2013/06/03 PHP
基于PHP读取csv文件内容的详解
2013/06/18 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
laravel中的fillable和guarded属性详解
2019/10/23 PHP
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
功能强大的Bootstrap使用手册(一)
2016/08/02 Javascript
Angularjs的ng-repeat中去除重复数据的方法
2016/08/05 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
jQuery each和js forEach用法比较
2019/02/27 jQuery
微信公众平台 发送模板消息(Java接口开发)
2019/04/17 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
Python数据库的连接实现方法与注意事项
2016/02/27 Python
在Django的View中使用asyncio的方法
2019/07/12 Python
如何基于Python实现自动扫雷
2020/01/06 Python
python一些性能分析的技巧
2020/08/30 Python
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
领导证婚人证婚词
2014/01/13 职场文书
5.12护士节演讲稿
2014/04/30 职场文书
工厂搬迁方案
2014/05/11 职场文书
保护环境建议书300字
2014/05/13 职场文书
体检通知范文
2015/04/21 职场文书
2015年民兵整组工作总结
2015/07/24 职场文书
九九重阳节致辞
2015/07/31 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电