Node.js assert断言原理与用法分析


Posted in Javascript onJanuary 04, 2019

本文实例讲述了Node.js assert断言原理与用法。分享给大家供大家参考,具体如下:

node.js官方API中文版 http://nodeapi.ucdok.com/#/api/assert.html

assert 模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。

class : assert
- assert.fail(actual, expected, message, operator)
- assert(value, message), assert.ok(value, [message])
- assert.equal(actual, expected, [message])
- assert.notEqual(actual, expected, [message])
- assert.deepEqual(actual, expected, [message])
- assert.notDeepEqual(actual, expected, [message])
- assert.strictEqual(actual, expected, [message])
- assert.notStrictEqual(actual, expected, [message])
- assert.throws(block, [error], [message])
- assert.doesNotThrow(block, [message])
- assert.ifError(value)

console.log(assert);
/*
输出如下
{ [Function: ok]
 AssertionError:
  { [Function: AssertionError]
   super_:
   { [Function: Error]
    captureStackTrace: [Function: captureStackTrace],
    stackTraceLimit: 10 } },
 fail: [Function: fail],
 ok: [Circular],
 equal: [Function: equal],
 notEqual: [Function: notEqual],
 deepEqual: [Function: deepEqual],
 notDeepEqual: [Function: notDeepEqual],
 strictEqual: [Function: strictEqual],
 notStrictEqual: [Function: notStrictEqual],
 throws: [Function],
 doesNotThrow: [Function],
 ifError: [Function] }
 */

assert是个函数,函数名为ok。javascript中函数是Function类的实例,也就是对象,所以可为其添加fail和equal等属性。注意输出结果第9行 ok:[Circular] 这个表述,这是指针循环的意思,即ok属性指向了本身,所以调用assert.ok就相当于调用了assert本身。

测试如下:

var test = function ok() {
  console.log('test ok');
}
//输出 undefined
test.ok = test;
//输出 { [Function: ok] ok: [Circular] }
test.fail = function fail() {
  console.log('test fail');
}
//输出 [Function: fail]
console.log(test);
//输出 {[Function: ok] ok: [Circular], fail: [Function: fail] }

比较相等操作符 ‘==' 会根据前面的参数进行类型转换。

true == 1;  // true
1 == true;  // true
true == 2;  // false
2 == true;  // false
'' == false; // true
false == ''; // true
1 == '1';  // true

全等操作符 ‘===' 会先比较元素的类型,只有类型和值都一样才算相等。

true === 1; // false
1 === '1'; // false

转回正题:

注意:如果不设置message,就会将value打印出来。

assert.fail(actual, expected, message, operator)

在不检查任何条件的情况下使断言失败。如果有错误信息则输出错误信息,否则输出actual和expected,中间用operator隔开。

assert.fail(1, 1);
//输出 AssertionError: 1 undefined 1
assert.fail(1, 1, undefined, '==');
//输出 AssertionError: 1 == 1
assert.fail(1, 2, undefined, '>');
//输出 AssertionError: 1 > 2
assert.fail(1, 2, 'whoops', '>');
//输出 AssertionError: whoops

assert(value, message), assert.ok(value, [message])

assert(true, 'message');
//输出 undefined
assert(false, 'message');
//输出 AssertionError: message
assert.ok(true, 'message');
//输出 undefined
assert.ok(false, 'message');
//输出 AssertionError: message

assert.equal(actual, expected, [message])

和比较操作符(==)的判断结果相同。当两边都是基本变量的时候转化为同一类型的变量再进行比较;如果是引用类型的变量,则直接比较其内存地址。

assert.equal(1, 1, 'message');
//输出 undefined
assert.equal(1, '1', 'message');
//输出 AssertionError: message

assert.strictEqual(actual, expected, [message])

Tests strict equality, as determined by the strict equality operator ( === )
严格相等,和全等符号(===)的判断结果相同。

assert.strictEqual(1, 1, 'message');
//输出 undefined
assert.strictEqual(1, '1', 'message');
//输出 AssertionError: message
assert.strictEqual(1, '1', 'message');
//输出 AssertionError: message

assert.deepEqual(actual, expected, [message])

当比较的双方均为基本类型时,等价于euqal()
当比较的双方均为引用类型时,即将引用类型中的每一个属性用equal()进行比较。

assert.equal(1, '1');
//输出 undefined
assert.deepEqual(1, '1');
//输出 undefined
assert.strictEqual(1, '1');
//输出 assert.strictEqual(1, '1');
assert.equal({a:1}, {a:'1'});
//输出 AssertionError: { a: 1 } == {a: '1'}
assert.deepEqual({a:1}, {a:'1'});
//输出 undefined
assert.strictEqual({a:1}, {a:'1'});
//输出 AssertionError: { a: 1 } == {a: '1'}

assert.throws(block, [error], [message])

Expects the function block to throw an error.
If specified, error can be a constructor, RegExp, or validation function.
If specified, message will be the message provided by the AssertionError if the block fails to throw.

assert.throws(
 () => {},
 Error
);
//输出 AssertionError: Missing expected exception (Error)..
assert.throws(
 () => {throw new Error('Wrong value');},
 Error
);
//输出 undefined
assert.throws(
 () => {throw new Error('Wrong value');},
 /Wrong/
);
//输出 undefined
assert.throws(
 () => {throw new Error('Wrong value');},
 /wrong/
);
//输出 Error: Wrong value
assert.throws(
 () => {throw new Error('Wrong value');},
 (err) => {
  if ((err instanceof Error) && /value/.test(err)) { return true;
  }
 },
 'unexpected error'
);
//输出 undefined

Note that error can not be a string. If a string is provided as the second argument, then error is assumed to be omitted and the string will be used for message instead. This can lead to easy-to-miss mistakes:

注意:错误信息不能是一个字符串。如果字符串被作为第二个参数,那么错误就会被假定为省略,并且字符串将会被用作提示信息,这样很容易导致错误。

assert.throws(()=>{throw new Error('Wrong value');}, 'Wrong', 'did not throw with expected message');
//输出 undefined
assert.throws(()=>{}, 'Wrong', 'did not throw with expected message');
//输出 AssertionError: Missing expected exception. Wrong
assert.throws(()=>{}, /Wrong/, 'did not throw with expected message');
//输出 AssertionError: Missing expected exception. did not with expected message.

assert.ifError(value)

Throws value if value is truthy. This is useful when testing the error argument in callbacks.

当值为真时,抛出AssertionError错误。该方法在测试回调函数的参数时非常有用。

assert.ifError(0);
//输出 undefined
assert.ifError(1);
//输出 1
assert.ifError('error');
//输出 error
assert.ifError(new Error('there maybe wrong'));
//输出 Error: there maybe wrong

希望本文所述对大家nodejs程序设计有所帮助。

Javascript 相关文章推荐
Jquery 一次处理多个ajax请求的代码
Sep 02 Javascript
jquery 使用简明教程
Mar 05 Javascript
JavaScript中关键字 in 的使用方法详解
Oct 17 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
Feb 07 Javascript
Bootstrap 网格系统布局详解
Mar 19 Javascript
基于JavaScript实现的快速排序算法分析
Apr 14 Javascript
ES6学习教程之对象字面量详解
Oct 09 Javascript
bootstrap中日历范围选择插件daterangepicker的使用详解
Apr 17 Javascript
JS实现图片切换效果
Nov 17 Javascript
JS实现电话号码的字母组合算法示例
Feb 26 Javascript
Element-UI+Vue模式使用总结
Jan 02 Javascript
JS异步堆栈追踪之为什么await胜过Promise
Apr 28 Javascript
如何为vuex实现带参数的 getter和state.commit
Jan 04 #Javascript
原生javascript实现连连看游戏
Jan 03 #Javascript
JavaScript键盘事件常见用法实例分析
Jan 03 #Javascript
JavaScript常见鼠标事件与用法分析
Jan 03 #Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
Jan 03 #Javascript
JavaScript实现shuffle数组洗牌操作示例
Jan 03 #Javascript
JavaScript实现数字前补“0”的五种方法示例
Jan 03 #Javascript
You might like
分享一则PHP定义函数代码
2015/02/26 PHP
PHP模板引擎Smarty内建函数详解
2016/04/11 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
TP3.2.3框架文件上传操作实例详解
2020/01/23 PHP
基于jquery的一个图片hover的插件
2010/04/24 Javascript
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
2015/12/03 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
在Vue中使用Compass的方法
2018/03/02 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
解决在Vue中使用axios POST请求变成OPTIONS的问题
2020/08/14 Javascript
[07:12]2014DOTA2西雅图国际邀请赛 黑马Liquid专题采访
2014/07/12 DOTA
用Python解决计数原理问题的方法
2016/08/04 Python
浅谈python中的变量默认是什么类型
2016/09/11 Python
浅析python协程相关概念
2018/01/20 Python
TensorFlow模型保存/载入的两种方法
2018/03/08 Python
Python3 修改默认环境的方法
2019/02/16 Python
python文件写入write()的操作
2019/05/14 Python
Python 串口读写的实现方法
2019/06/12 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
Python:合并两个numpy矩阵的实现
2019/12/02 Python
如何使用python传入不确定个数参数
2020/02/18 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
早餐连锁店计划书
2014/01/08 职场文书
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
教师工作表现自我评价
2015/03/05 职场文书
小学庆六一主持词
2015/06/30 职场文书
如何做好员工培训计划?
2019/07/09 职场文书
redis实现共同好友的思路详解
2021/05/26 Redis
springboot用户数据修改的详细实现
2022/04/06 Java/Android
i7 6700处理器相当于i5几代
2022/04/19 数码科技