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 相关文章推荐
JavaScript OOP类与继承
Nov 15 Javascript
jQuery 快速结束当前正在执行的动画
Nov 20 Javascript
快速解决jQuery与其他库冲突的方法介绍
Jan 02 Javascript
jquery马赛克拼接翻转效果代码分享
Aug 24 Javascript
基于jQuery实现选取月份插件附源码下载
Dec 28 Javascript
jQuery 遍历map()方法详解
Nov 04 Javascript
JavaScript实现获取远程的html到当前页面中
Mar 26 Javascript
Vue2.0表单校验组件vee-validate的使用详解
May 02 Javascript
AngularJS 限定$scope的范围实例详解
Jun 23 Javascript
webpack4.x CommonJS模块化浅析
Nov 09 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
Dec 02 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
Feb 13 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/08/08 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
Open and Print a Word Document
2007/06/15 Javascript
jQuery学习3:操作元素属性和特性
2010/02/07 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
javascript中String对象的slice()方法分析
2014/12/20 Javascript
使用jQuery实现input数值增量和减量的方法
2015/01/24 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
学习使用bootstrap的modal和carousel
2016/12/09 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
javascript实现QQ空间相册展示源码
2017/12/12 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
React Component存在的几种形式详解
2018/11/06 Javascript
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
在树莓派2或树莓派B+上安装Python和OpenCV的教程
2015/03/30 Python
Python入门_条件控制(详解)
2017/05/16 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
python实现银行管理系统
2019/10/25 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
Django QuerySet查询集原理及代码实例
2020/06/13 Python
详解Python模块化编程与装饰器
2021/01/16 Python
车间组长岗位职责
2013/12/20 职场文书
单位授权委托书范文
2014/08/02 职场文书
学生检讨书
2015/01/27 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
React + Threejs + Swiper 实现全景图效果的完整代码
2021/06/28 Javascript
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技