Chai中只有自己的Object属性的深度对象等式

时间:2015-07-10 06:17:11

标签: javascript chai

我有一个对象,我想与chaijs中的另一个对象进行深度比较。麻烦的是,一个对象具有大量可枚举属性,另一个对象是一个简单,直接的对象({})。

例如,我有expect(obj1).to.eql(obj2);其中obj1是一个对象,其中添加了许多其他可枚举属性,而obj2只是通过var obj2 = { someValue: true }创建的。

可以通过滥用JSON.stringifyJSON.parse来解决此问题

expect(JSON.parse(JSON.stringify(obj1))).to.eql(obj2);

但这是一个相当蹩脚的黑客。我无法想象我是第一个遇到这种困境的人,但我的搜索结果却是空洞的。这里推荐的方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用chai-shallow-deep-equal。它不执行完全相等性检查,但检查第二个对象是否包含第一个对象的属性集。

这是用法示例:

var chai = require('chai');
chai.use(require('chai-shallow-deep-equal'));

var obj1 = {name: 'Michel', language: 'javascript'};
var obj2 = {name: 'Michel'};
var obj2 = {name: 'Michel', age: 43};

expect(obj1).to.shallowDeepEqual(obj2); // true
expect(obj1).to.shallowDeepEqual(obj3); // false, age is undefined in obj1

答案 1 :(得分:0)

我建议您对要测试的对象进行投影,其中只包含"拥有" (不是来自原型链)属性,并将其与相等性进行比较。

var projection = {};

for (var key in obj1) {
    if (obj1.hasOwnProperty(key)) {
        projection[key] = obj1[key];
    }
}

expect(projection).to.eql(obj2);

您可以将该投影代码提取到测试实用程序函数中。