Node.js API详解之 assert模块用法实例分析


Posted in Javascript onMay 26, 2020

本文实例讲述了Node.js API详解之 assert模块用法。分享给大家供大家参考,具体如下:

Node.js API详解之 assert

assert 模块提供了断言测试的函数,用于测试不变式。
断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,
可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。
同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
使用断言可以创建更稳定、品质更好且不易于出错的代码。
当需要在一个值为false时中断当前操作的话,可以使用断言。
单元测试必须使用断言(Junit/JunitX)。

使用方式:

const assert = require('assert');

assert.ok(value[, message])

说明:

测试 value 是否为真值。 相当于 assert.equal(!!value, true, message)。
如果 value 不为真值,则抛出一个带有 message 属性的 AssertionError,
其中 message 属性的值等于传入的 message 参数的值。
如果 message 参数为 undefined,则赋予默认的错误信息。

demo:

const assert = require('assert');
assert.ok(true);
// 测试通过。
assert.ok(1);
// 测试通过。
assert.ok(false);
// 抛出 "AssertionError: false == true"
assert.ok(0);
// 抛出 "AssertionError: 0 == true"
assert.ok(false, '不是真值');
// 抛出 "AssertionError: 不是真值"

assert(value[, message])

说明:

assert.ok() 的别名。
用法与 assert.ok() 相同。

demo:

const assert = require('assert');
assert(true);
// 测试通过。
assert(1);
// 测试通过。
assert(false);
// 抛出 "AssertionError: false == true"
assert(0);
// 抛出 "AssertionError: 0 == true"
assert(false, '不是真值');
// 抛出 "AssertionError: 不是真值"

assert.ifError(value)

说明:

如果 value 为真,则抛出 value。 可用于测试回调函数的 error 参数。
源码:function ifError(err) { if (err) throw err; };

demo:

const assert = require('assert');
assert.ifError(0);
// 通过。
assert.ifError(1);
// 抛出 1。
assert.ifError('error');
// 抛出 'error'。
assert.ifError(new Error());
// 抛出 Error。

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

说明:

使用相等运算符(==)测试 actual 参数与 expected 参数是否相等

demo:

const assert = require('assert');
assert.equal(1, 1);
// 测试通过,1 == 1。
assert.equal(1, '1');
// 测试通过,1 == '1'。
assert.equal(1, 2);
// 抛出 AssertionError: 1 == 2
assert.equal({ a: { b: 1 } }, { a: { b: 1 } });
// 抛出 AssertionError: { a: { b: 1 } } == { a: { b: 1 } }

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

说明:

测试 actual 参数与 expected 参数是否深度相等。 原始值使用相等运算符(==)比较。
只测试可枚举的自身属性,不测试对象的原型、连接符、或不可枚举的属性(这些情况使用 assert.deepStrictEqual())。
Map 和 Set 包含的子项也会被测试。
如果两个值不相等,则抛出一个带有 message 属性的 AssertionError,
其中 message 属性的值等于传入的 message 参数的值。
如果 message 参数为 undefined,则赋予默认的错误信息。

demo:

const assert = require('assert');
const obj1 = {
 a: {
  b: 1
 }
};
const obj2 = {
 a: {
  b: 2
 }
};
const obj3 = {
 a: {
  b: 1
 }
};
const obj4 = Object.create(obj1);
assert.deepEqual(/a/gi, new Date());
//测试通过,因为 RegExp 对象的属性不是可枚举的:
assert.deepEqual(obj1, obj1);
// 测试通过,对象与自身相等。
assert.deepEqual(obj1, obj2);
// 抛出 AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } }
// 因为 b 属性的值不同。
assert.deepEqual(obj1, obj3);
// 测试通过,两个对象相等。
assert.deepEqual(obj1, obj4);
// 抛出 AssertionError: { a: { b: 1 } } deepEqual {}
// 因为不测试原型。

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

说明:

与 assert.deepEqual() 大致相同,但有一些区别:
1.原始值使用全等运算符(===)比较。Set 的值与 Map 的键使用 SameValueZero 比较。
2.对象的原型也使用全等运算符比较。
3.对象的类型标签要求相同。
4.比较[对象包装器][]时,其对象和里面的值要求相同。

demo:

const assert = require('assert');
assert.deepEqual({ a: 1 }, { a: '1' });
// 测试通过,因为 1 == '1'。
assert.deepStrictEqual({ a: 1 }, { a: '1' });
// 抛出 AssertionError: { a: 1 } deepStrictEqual { a: '1' }
// 因为使用全等运算符 1 !== '1'。
// 以下对象都没有自身属性。
const date = new Date();
const object = {};
const fakeDate = {};
Object.setPrototypeOf(fakeDate, Date.prototype);
assert.deepEqual(object, fakeDate);
// 测试通过,不测试原型。
assert.deepStrictEqual(object, fakeDate);
// 抛出 AssertionError: {} deepStrictEqual Date {}
// 因为原型不同。
assert.deepEqual(date, fakeDate);
// 测试通过,不测试类型标签。
assert.deepStrictEqual(date, fakeDate);
// 抛出 AssertionError: 2017-03-11T14:25:31.849Z deepStrictEqual Date {}
// 因为类型标签不同。
assert.deepStrictEqual(new Number(1), new Number(2));
// 测试不通过,因为数值对象包装器里面的数值也会被比较。
assert.deepStrictEqual(new String('foo'), Object('foo'));
// 测试通过,因为这两个对象和里面的字符串都是相同的

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

说明:

使用全等运算符(===)测试 actual 参数与 expected 参数是否全等。

demo:

onst assert = require('assert');
assert.strictEqual(1, 2);
// 抛出 AssertionError: 1 === 2
assert.strictEqual(1, 1);
// 测试通过。
assert.strictEqual(1, '1');
// 抛出 AssertionError: 1 === '1'

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

说明:

使用不等运算符(!=)测试 actual 参数与 expected 参数是否不相等。

demo:

const assert = require('assert');
assert.notEqual(1, 2);
// 测试通过。
assert.notEqual(1, 1);
// 抛出 AssertionError: 1 != 1
assert.notEqual(1, '1');
// 抛出 AssertionError: 1 != '1'

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

说明:

测试 actual 参数与 expected 参数是否不深度相等。 与 assert.deepEqual() 相反。

demo:

const assert = require('assert');
const obj1 = {
 a: {
  b: 1
 }
};
const obj2 = {
 a: {
  b: 2
 }
};
const obj3 = {
 a: {
  b: 1
 }
};
const obj4 = Object.create(obj1);
assert.notDeepEqual(obj1, obj1);
// 抛出 AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } }
assert.notDeepEqual(obj1, obj2);
// 测试通过,obj1 与 obj2 不深度相等。
assert.notDeepEqual(obj1, obj3);
// 抛出 AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } }
assert.notDeepEqual(obj1, obj4);
// 测试通过,obj1 与 obj4 不深度相等。

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

说明:

测试 actual 参数与 expected 参数是否不深度全等。 与 assert.deepStrictEqual() 相反。

demo:

const assert = require('assert');
assert.notDeepEqual({ a: 1 }, { a: '1' });
// 抛出 AssertionError: { a: 1 } notDeepEqual { a: '1' }
assert.notDeepStrictEqual({ a: 1 }, { a: '1' });
// 测试通过。

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

说明:

使用不全等运算符(!==)测试 actual 参数与 expected 参数是否不全等。

demo:

const assert = require('assert');
assert.notStrictEqual(1, 2);
// 测试通过。
assert.notStrictEqual(1, 1);
// 抛出 AssertionError: 1 !== 1
assert.notStrictEqual(1, '1');
// 测试通过。
assert.fail(message)

assert.fail(actual, expected[, message[, operator[, stackStartFunction]]])

说明:

抛出 AssertionError。 如果 message 参数为空,则错误信息为 actual 参数 + operator 参数 + expected 参数。
如果只提供了 actual 参数与 expected 参数,则 operator 参数默认为 ‘!='。
如果提供了 message 参数,则它会作为错误信息,其他参数会保存在错误对象的属性中。
如果提供了 stackStartFunction 参数,则该函数上的栈帧都会从栈信息中移除

demo:

const assert = require('assert');
assert.fail(1, 2, undefined, '>');
// 抛出 AssertionError [ERR_ASSERTION]: 1 > 2
assert.fail(1, 2, '错误信息');
// 抛出 AssertionError [ERR_ASSERTION]: 错误信息
assert.fail(1, 2, '错误信息', '>');
// 抛出 AssertionError [ERR_ASSERTION]: 错误信息
// 上面两个例子的 `actual` 参数、`expected` 参数与 `operator` 参数不影响错误消息。
assert.fail();
// 抛出 AssertionError [ERR_ASSERTION]: Failed
assert.fail('错误信息');
// 抛出 AssertionError [ERR_ASSERTION]: 错误信息
assert.fail('a', 'b');
// 抛出 AssertionError [ERR_ASSERTION]: 'a' != 'b'
//使用 stackStartFunction 参数拦截异常的栈信息:
function suppressFrame() {
 assert.fail('a', 'b', undefined, '!==', suppressFrame);
}
suppressFrame();
// AssertionError [ERR_ASSERTION]: 'a' !== 'b'
//   at repl:1:1
//   at ContextifyScript.Script.runInThisContext (vm.js:44:33)
//   ...

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

说明:

断言 block 函数会抛出错误。
error 参数可以是构造函数、正则表达式、或自定义函数。
如果指定了 message 参数,则当 block 函数不抛出错误时,message 参数会作为 AssertionError 的错误信息。

demo:

const assert = require('assert');
assert.throws(
 () => {
  throw new Error('错误信息');
 },
 /123/
);
// Error: 错误信息
assert.throws(
 () => {
  throw new Error('错误信息');
 },
 /错误/
);
// 通过
assert.throws(
 () => {
  throw new Error('错误信息');
 },
 Error
);
// 通过
assert.throws(
 () => {
  throw new Error('错误信息');
 },
 function(err) {
  if ((err instanceof Error) && /错误/.test(err)) {
   return true;
  }
 },
 '不是期望的错误'
);
// 通过
// error 参数不能是字符串。 如果第二个参数是字符串,则视为省略 error 参数,传入的字符串会被用于 message 参数。
// 这是错误的!不要这么做!
assert.throws(() => {
  throw new Error('错误信息');
 }, '错误信息', '没有抛出期望的信息');
 
// 应该这么做。
assert.throws(() => {
  throw new Error('错误信息');
 }, /错误信息/, '没有抛出期望的信息');

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

说明:

断言 block 函数不会抛出错误。
当 assert.doesNotThrow() 被调用时,它会立即调用 block 函数。
如果抛出错误且错误类型与 error 参数指定的相同,则抛出 AssertionError。
如果错误类型不相同,或 error 参数为 undefined,则抛出错误。

demo:

const assert = require('assert');
assert.doesNotThrow(
 () => {
  throw new TypeError('错误信息');
 },
 SyntaxError
);
// TypeError: 错误信息
assert.doesNotThrow(
 () => {
  throw new TypeError('错误信息');
 },
 TypeError
);
// AssertionError [ERR_ASSERTION]: Got unwanted exception.
// 错误信息
// 如果抛出了 AssertionError 且有给 message 参数传值,则 message 参数的值会被附加到 AssertionError 的信息中:
assert.doesNotThrow(
 () => {
  throw new TypeError('错误信息');
 },
 TypeError,
 '抛出错误'
);
// AssertionError [ERR_ASSERTION]: Got unwanted exception: 抛出错误
// 错误信息

注意事项

说明:

对于 SameValueZero 比较,建议使用 ES2015 的 Object.is()。

demo:

const a = 0;
const b = -a;
assert.notStrictEqual(a, b);
// 抛出 AssertionError: 0 !== -0
// 因为全等运算符不区分 -0 与 +0。
assert(!Object.is(a, b));
// 但 Object.is() 可以区分。
const str1 = 'foo';
const str2 = 'foo';
assert.strictEqual(str1 / 1, str2 / 1);
// 抛出 AssertionError: NaN === NaN
// 因为全等运算符不能用于测试 NaN。
assert(Object.is(str1 / 1, str2 / 1));
// 但 Object.is() 可以测试。

SameValueZero

说明:

内部比较操作SameValueZero(x,y)
如果 type of x 不同于 type of y,返回false。
如果 type of x 是数字,那么
如果 x 为 NaN, y 为 NaN,返回 true。
如果 x 是 +0 而 y 是 -0,返回 true。
如果 x 是 -0 而 y 是 +0,返回 true。
如果 x 与 y 相同,则返回 true。
返回 假。

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

Javascript 相关文章推荐
使用JQUERY进行后台页面布局控制DIV实现左右式
Jan 07 Javascript
jquery的ajax异步请求接收返回json数据实例
Jun 16 Javascript
浅谈js中变量初始化
Feb 03 Javascript
jQuery自定义组件(导入组件)
Nov 08 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
Feb 13 Javascript
JavaScript数据类型的存储方法详解
Aug 25 Javascript
vue 属性拦截实现双向绑定的实例代码
Oct 24 Javascript
傻瓜式解读koa中间件处理模块koa-compose的使用
Oct 30 Javascript
微信打开网址添加在浏览器中打开提示的办法
May 20 Javascript
通过实例讲解JS如何防抖动
Jun 15 Javascript
layui use 定义js外部引用函数的方法
Sep 26 Javascript
React中获取数据的3种方法及优缺点
Feb 18 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
May 26 #Javascript
js校验开始时间和结束时间
May 26 #Javascript
vue实现简单跑马灯效果
May 25 #Javascript
Js和VUE实现跑马灯效果
May 25 #Javascript
Vue实现简单的跑马灯
May 25 #Javascript
Vue实现跑马灯效果
May 25 #Javascript
JavaScript实现移动端弹窗后禁止滚动
May 25 #Javascript
You might like
文件上传类
2006/10/09 PHP
PHP读取zip文件的方法示例
2016/11/17 PHP
js setattribute批量设置css样式
2009/11/26 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
JavaScript 创建运动框架的实现代码
2013/05/08 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
浅谈js中变量初始化
2015/02/03 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
2020/07/18 Javascript
[01:28]2014DOTA2国际邀请赛中国区预选赛四大豪门直升机抵达会场
2014/05/24 DOTA
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
总结python爬虫抓站的实用技巧
2016/08/09 Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
pygame实现简易飞机大战
2018/09/11 Python
django基于restframework的CBV封装详解
2019/08/08 Python
Flask模板引擎Jinja2使用实例
2020/04/23 Python
Django-imagekit的使用详解
2020/07/06 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
解决pytorch 保存模型遇到的问题
2021/03/03 Python
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
美国办公用品折扣网站:Shoplet.com
2019/11/24 全球购物
祖国在我心中的演讲稿
2014/05/04 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
2014年宣传工作总结
2014/11/18 职场文书
创业计划书之家教托管
2019/09/25 职场文书
SQL语法CONSTRAINT约束操作详情
2022/01/18 MySQL
Mysql中mvcc各场景理解应用
2022/08/05 MySQL