assert-断言模块提供了断言测试的函数,用于测试不变式。对其中常用的一些断言函数的介绍,包括值比较和函数错误抛出断言
- 用于比较值的断言函数
1.assert.equal(actual, expected[, message]),此函数是判断实际值(actual)与期望徝(expected)是否相等“==”,如果不相等,则抛出一个message的错误。此种比较是经过类型转化后的比较:
const assert = require('assert');
assert.equal(1, 1);
// 测试通过
assert.equal(1, '1');
// 测试通过
assert.equal(1, 2);
AssertionError [ERR_ASSERTION]: 1 == 2
assert.equal({ [1] }, { [1] });
// AssertionError [ERR_ASSERTION]: [ 1 ] == [ 1 ]
assert.equal({ a: { b: 1 } }, { a: { b: 1 } });
// AssertionError [ERR_ASSERTION]: { a: { b: 1 } } == { a: { b: 1 } }
复制代码
注:assert.equal(actual, expected[, message]),比较范围只能是js中的基本数据类型比较,不能用作引用数据类型比较。
2.assert.strictEqual(actual, expected[, message])此函数是判断实际值(actual)与期望徝(expected)是否相等“===”,如果不相等,则抛出一个message的错误。此种比较是不经过类型转化后的比较:
const assert = require('assert').strict;
assert.strictEqual(1, 2);
// AssertionError [ERR_ASSERTION]: 1 == 2
assert.strictEqual(1, 1);
// 测试通过。
assert.strictEqual(1, '1');
// AssertionError [ERR_ASSERTION]: 1 == '1'
assert.equal({ [1] }, { [1] });
// AssertionError [ERR_ASSERTION]: [ 1 ] == [ 1 ]
assert.equal({ a: { b: 1 } }, { a: { b: 1 } });
// AssertionError [ERR_ASSERTION]: { a: { b: 1 } } == { a: { b: 1 } }
复制代码
注:assert.strictEqual(actual, expected[, message]),比较范围只能是js中的基本数据类型比较,不能用作引用数据类型比较。
3.assert.deepEqual(actual, expected[, message]),此函数是判断实际值(actual)与期望徝(expected)子对象的可枚举属性也会被列入比较。如果本身属性及子对象属性都相等时通过。否则会抛出错误,如果不相等,则抛出一个message的错误。
const assert = require('assert');
assert.deepEqual(1, 1);
// 测试通过。
assert.deepEqual({a:{d:2}}, {a:{d:2}});
// 测试通过。
assert.deepEqual({a:{d:2}}, {a:{d:'2'}});
// 测试通过。
assert.deepEqual([1,2,3], [1,2,3]);
// 测试通过。
assert.deepEqual({a:{d:2}}, {a:{d:3}});
//AssertionError [ERR_ASSERTION]: { a: { d: 2 } } deepEqual { a: { d: 3 }
}
复制代码
注:assert.deepEqual(actual, expected[, message]),比较范围既能是js中的基本数据类型比较,也能用作引用数据类型比较但是枚举后对值是一种'=='比较。
4.assert.deepStrictEqual(actual, expected[, message]),此函数是判断实际值(actual)与期望徝(expected)子对象的可枚举属性也会被列入比较。如果本身属性及子对象属性都相等时通过。否则会抛出一个message的错误。
const assert = require('assert');
assert.deepStrictEqual({a:1},{a:'1'})
//AssertionError [ERR_ASSERTION]: { a: 1 } deepStrictEqual { a: '1' }
const date = new Date();
const object = {};
const fakeDate = {};
Object.setPrototypeOf(fakeDate, Date.prototype);
// 原型不同:
//assert.deepStrictEqual(object, fakeDate);
AssertionError [ERR_ASSERTION]: 2018-06-03T11:32:54.753Z deepStrictEqual Date {}
// 类型标签不同:一个为时间实例,一个为对象
assert.deepStrictEqual(date, fakeDate);
AssertionError [ERR_ASSERTION]: 2018-06-03T13:58:40.087Z deepStrictEqual Date {}
//NaN的比较,特别注意
assert.deepStrictEqual(NaN, NaN);
// 通过,因为使用的是 SameValue 比较法。
// 解封装后的数值不同:
assert.deepStrictEqual(new Number(1), new Number(2));
AssertionError [ERR_ASSERTION]: [Number: 1] deepStrictEqual [Number: 2]
assert.deepStrictEqual(new String('foo'), Object('foo'));
// 通过,因为对象与解封装后的字符串都完全相同。
复制代码
- 块状函数测试抛出错误
1.assert.throws(block[, error][, message]),block 为一个函数,block 函数会抛出错误,error 可以是 Class、RegExp、校验函数、每个属性都会被测试是否深度全等的校验对象、或每个属性(包括不可枚举的 message 和 name 属性)都会被测试是否深度全等的错误实例。 当使用对象时,可以使用正则表达式来校验字符串属性。 详见下面的例子。 如果指定了 message 参数,则当 block 函数不抛出错误时,message 参数会作为 AssertionError 的错误信息。
const err = new TypeError('错误信息');
err.code = 404;
err.foo = 'bar';
err.info = {
nested: true,
baz: 'text'
};
err.reg = /abc/i;
assert.throws(
() => {
throw err;
},
{
name: 'TypeError',
message: '错误信息'
info: {
nested: true,
baz: 'text'
}
// 注意,只有校验对象的属性会被测试。
// 使用嵌套的对象必须提供全部属性,否则校验会失败。
}
);
// 使用正则表达式来校验错误属性:
assert.throws(
() => {
throw err;
},
{
// `name` 和 `message` 属性为字符串,对它们使用正则表达式进行匹配。
// 如果校验失败,则抛出错误。
name: /^TypeError$/,
message: /错误信息/,
foo: 'bar',
info: {
nested: true,
// 嵌套的属性不可以使用正则表达式!
baz: 'text'
},
// `reg` 属性包含了一个正则表达式,只有校验对象也包含一个完全相同的正则表达式时,校验才会通过。
reg: /abc/i
}
);
复制代码