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 相关文章推荐
强制设为首页代码
Jun 19 Javascript
使用JavaScript 实现各种跨域的方法
May 08 Javascript
jquery.post用法示例代码
Jan 03 Javascript
javascript实现文本域写入字符时限定字数
Feb 12 Javascript
javascript中返回顶部按钮的实现
May 05 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
Aug 30 Javascript
理解jquery事件冒泡
Jan 03 Javascript
vue.js实现单选框、复选框和下拉框示例
Jul 18 Javascript
layui框架table 数据表格的方法级渲染详解
Aug 19 Javascript
vue使用nprogress实现进度条
Dec 09 Javascript
JS 图片压缩原理与实现方法详解
Apr 29 Javascript
你不知道的 TypeScript 高级类型(小结)
Aug 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二维/三维数组转字符串
2013/09/13 PHP
PHP中的类型提示(type hinting)功能介绍
2015/07/01 PHP
php使用文本统计访问量的方法
2016/05/12 PHP
理解JavaScript中的事件
2006/09/23 Javascript
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
需要做特殊处理的DOM元素属性的访问
2010/11/05 Javascript
javascript实现的元素拖动函数宿主为浏览器
2014/07/21 Javascript
javascript实现删除前弹出确认框
2015/06/04 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
2015/10/29 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
详解Angular2组件之间如何通信
2017/06/22 Javascript
Vue.directive使用注意(小结)
2018/08/31 Javascript
element ui分页多选,翻页记忆的实例
2019/09/03 Javascript
vue实现在线翻译功能
2019/09/27 Javascript
JQuery事件冒泡和默认行为代码实例
2020/05/13 jQuery
Vue 解决父组件跳转子路由后当前导航active样式消失问题
2020/07/21 Javascript
TypeScript 运行时类型检查补充工具
2020/09/28 Javascript
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
python使用pyhook监控键盘并实现切换歌曲的功能
2014/07/18 Python
Python实现自动上京东抢手机
2018/02/06 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
2018/05/25 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
pandas 按照特定顺序输出的实现代码
2018/07/10 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
教师试用期自我鉴定
2014/02/12 职场文书
市场营销工作计划书
2014/05/06 职场文书
职员竞岗演讲稿
2014/05/14 职场文书
上班离岗检讨书
2014/09/10 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
离婚协议书范本
2015/01/26 职场文书
花木兰观后感
2015/06/10 职场文书
新教师2015年度工作总结
2015/07/22 职场文书
二手手机买卖合同范本(2019年版)
2019/10/28 职场文书