本篇仅是我的对于assert断言学习的梳理,也但愿能够给开始学习assert同窗提供一个基础框架。node
assert模块提供了一组简单的断言测试,可用于测试不变量。
存在严格模式(strict)和 遗留模式(legacy),但建议仅使用严格模式。数组
Error的子类,代表断言的失败。assert模块抛出的全部错误都是AssertionError类的实例框架
注意:在最新的node版本中不含strict的方法已经被废弃函数
assert(true, 'message'); //输出 undefined assert(false, 'message'); //输出 AssertionError: message
assert.strictEqual(1, 1, 'message'); //输出 undefined assert.strictEqual(1, '1', 'message'); //输出 AssertionError: message assert.strictEqual(1, '1', 'message'); //输出 AssertionError: message
assert.deepStrictEqual(actual, expected, [message])
测试 actual 参数和 expected 参数之间的深度相等。
1.当比较的双方均为基本类型时,等价于euqal()。
2.当比较的双方均为引用类型时,即将引用类型中的每个属性用equal()进行比较。
比较规则学习
使用 SameValue比较(使用 Object.is())来比较原始值。 对象的类型标签应该相同。 使用严格相等比较来比较对象的原型。 只考虑可枚举的自身属性。 始终比较 Error 的名称和消息,即便这些不是可枚举的属性。 可枚举的自身 Symbol 属性也会比较。 对象封装器做为对象和解封装后的值都进行比较。 Object 属性的比较是无序的。 Map 键名与 Set 子项的比较是无序的。 当两边的值不相同或遇到循环引用时,递归中止。
const assert = require('assert').strict; // 失败,由于 1 !== '1'。 assert.deepStrictEqual({ a: 1 }, { a: '1' }); // 如下对象没有自身属性。 const date = new Date(); const object = {}; const fakeDate = {}; Object.setPrototypeOf(fakeDate, Date.prototype); // 原型不一样: assert.deepStrictEqual(object, fakeDate); // - {} // + Date {} // 类型标签不一样: assert.deepStrictEqual(date, fakeDate); // - 2018-04-26T00:49:08.604Z // + Date {} assert.deepStrictEqual(NaN, NaN); // 经过,由于使用 SameValue 比较。 // 解封装后的数字不一样: assert.deepStrictEqual(new Number(1), new Number(2)); // - [Number: 1] // + [Number: 2] assert.deepStrictEqual(new String('foo'), Object('foo')); // 经过,由于对象与解封装后的字符串都是相同的。 assert.deepStrictEqual(-0, -0); // 经过。 // 使用 SameValue 比较的零不一样: assert.deepStrictEqual(0, -0); // - 0 // + -0 const symbol1 = Symbol(); const symbol2 = Symbol(); assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol1]: 1 }); // 经过,由于在两个对象上的 symbol 相同。 assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol2]: 1 }); // { // [Symbol()]: 1 // } const weakMap1 = new WeakMap(); const weakMap2 = new WeakMap([[{}, {}]]); const weakMap3 = new WeakMap(); weakMap3.unequal = true; assert.deepStrictEqual(weakMap1, weakMap2); // 经过,由于没法比较条目。 // 失败,由于 weakMap3 有一个 weakMap1 不包含的属性: assert.deepStrictEqual(weakMap1, weakMap3); // WeakMap { // - [items unknown] // + [items unknown], // + unequal: true // }
const assert = require('assert').strict; assert.fail(); // AssertionError [ERR_ASSERTION]: Failed assert.fail('失败'); // AssertionError [ERR_ASSERTION]: 失败 assert.fail(new TypeError('须要数组')); // TypeError: 须要数组