assert.deepEqual(actual,expected,[,message])
断言actual
和expected
相等,用==
判断否则抛出错误信息,AssertionError:message
,只测试可枚举对象,不测试原型对象。
const obj1 = {a:{b:1}};
const obj2 = {a:{b:2}};
const obj3 = {a:{b:1}};
const obj4 = Object.create(obj1);
assert.deepEqual(obj1,obj1);//自身相等
assert.deepEqual(obj1,obj3);//值相等
assert.deepEqual(obj1,obj4,["obj1 don't equal to obj4"]);//抛出AssertionError: obj1 don't equal to obj4,因为obj4的属性在原型上
assert.deepEqual(obj1,obj2,["obj1 don't equal to obj2"]);//抛出AssertionError: obj1 don't equal to obj2,若这里的message为undefined,则assert.deepEqual(obj1,obj2)抛出AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } }
由于deepEqual
测试可枚举属性,且原始值用==
判断,因此,判断对象相等时也是枚举其属性到原始值再进行比较,而equal
则直接用==
比较对象。
assert.equal({'a': 2}, {'a': '2'});//不通过,AssertionError [ERR_ASSERTION]: { a: 2 } == { a: '2' }
与之相反的方法assert.notDeepEqual();
deepStrictEqual(actual,expected,[,message])
用===
判断对象属性,比较原型。
assert.deepEqual({'a':2},{'a':'2'});//通过,2==‘2’
assert.deepStrictEqual({'a':2},{'a':'2'});//不通过2!==‘2’
assert.deepStrictEqual({'a':2},{'a':2});//通过,枚举属性比较
const date = new Date();
const object = {};
const fakeDate = {};
Object.setPrototypeOf(fakeDate, Date.prototype);
assert.deepStrictEqual(object, fakeDate);//不通过,原型不相等 抛出 AssertionError: {} deepStrictEqual Date {}
assert.deepEqual(object, fakeDate);//通过,不测试类型标签
assert.deepEqual(date, fakeDate);//通过,不测试类型标签
assert.deepStrictEqual(date, fakeDate);//通过,可理解为枚举空属性,所以相等,前面两个通过的断言也可这样理解。
直接利用===
运算符比较的断言方法
assert.strictEqual(actual,expected,[,message]);
assert.notStrictEqual(actual,expected,[,message]);
assert.deepStrict(actual,expected,[,message]);
assert.notDeepStrict(actual,expected,[,message]);
而前面的deepStrictEqual()
方法在判断时将枚举属性。
利用==
运算符比较的断言方法
assert.equal(actual,expected,[,message]);
assert.notEqual(actual,expected,[,message]);
其他方法
assert.ok(value,[,message])//判断value是否是真值
assert.ifError(value)//若value为真值,则抛出value