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应用于login页面的问题及解决
Oct 17 Javascript
JS简单实现元素复制示例附图
Nov 19 Javascript
jQuery简单tab切换效果实现方法
Apr 08 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
May 31 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
Aug 23 Javascript
9种改善AngularJS性能的方法
Nov 28 Javascript
Javascript实现动态时钟效果
Nov 17 Javascript
js删除数组中某几项的方法总结
Jan 16 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
Aug 23 Javascript
vue学习笔记之给组件绑定原生事件操作示例
Feb 27 Javascript
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
Jan 29 Javascript
vue实现书本翻页动画效果实例详解
Apr 08 Vue.js
如何为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
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
php获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
微信推送功能实现方式图文详解
2019/07/12 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
Js+php实现异步拖拽上传文件
2015/06/23 Javascript
一个php+js实时显示时间问题
2015/10/12 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
第一次接触神奇的Bootstrap菜单和导航
2016/08/01 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
2016/09/05 Javascript
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
2019/09/25 Javascript
Python爬虫爬验证码实现功能详解
2016/04/14 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
Python中的os.path路径模块中的操作方法总结
2016/07/07 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
关于numpy数组轴的使用详解
2019/12/05 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
python3中sys.argv的实例用法
2020/04/24 Python
python 使用raw socket进行TCP SYN扫描实例
2020/05/05 Python
Python学习笔记之装饰器
2020/08/06 Python
python 装饰器的使用示例
2020/10/10 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
HTML5 textarea高度自适应的两种方案
2020/04/08 HTML / CSS
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
初中校园之声广播稿
2014/01/15 职场文书
亲子拓展活动方案
2014/02/20 职场文书
机修工工作职责
2014/02/21 职场文书
作风建设剖析材料
2014/10/06 职场文书
给领导敬酒词
2015/08/12 职场文书
信息技术研修心得体会
2016/01/08 职场文书
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技