我有一个对象,我想与chaijs中的另一个对象进行深度比较。麻烦的是,一个对象具有大量可枚举属性,另一个对象是一个简单,直接的对象({}
)。
例如,我有expect(obj1).to.eql(obj2);
其中obj1
是一个对象,其中添加了许多其他可枚举属性,而obj2
只是通过var obj2 = { someValue: true }
创建的。
可以通过滥用JSON.stringify
和JSON.parse
来解决此问题
expect(JSON.parse(JSON.stringify(obj1))).to.eql(obj2);
但这是一个相当蹩脚的黑客。我无法想象我是第一个遇到这种困境的人,但我的搜索结果却是空洞的。这里推荐的方法是什么?
答案 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);
您可以将该投影代码提取到测试实用程序函数中。