我很难在这里找到好名字,但我会描述我想要的东西:
断言函数,例如节点assert.deepEqual(obj1, obj2)
,但不是递归地将obj1
与obj2
进行比较,而是应该有这样的签名:deepPartiallyEqual(spec, obj)
并且只检查{{1} "适合"在spec
或obj
"符合"如果您愿意,可以obj
。 (也许一个很好的比较是ramdas whereEq,但它很浅)
(问题的背景是单元测试)
示例(传递):
spec
示例(失败):
spec = {user: {name: 'Elin', age: 30}};
obj = {user: {id: 1, name: 'Elin', sex: 'f', age: 30}};
deepPartiallyEqual(spec, obj);
// would pass
我在javascript的任何断言库中都存在我所描述的内容吗?在其他平台上? ......如果是的话,它叫什么?
动机:
我在相当大的对象上断言事情,但我只对测试他们的一些(可能是嵌套的)属性具有正确的值感兴趣。所以我只想断言对象键的子集。如果我必须做一个deepEquals,那么我的测试文件将会出现具有90%属性的对象文字,而我对测试并不感兴趣。
但与此同时,分别测试每个房产:
spec = {user: {name: 'Cedric', age: 31}};
obj = {user: {id: 1, name: 'Elin', sex: 'f', age: 30}};
deepPartiallyEqual(spec, obj);
// should result in a failed test and an error output similar to:
AssertionError: ...
+ expected - actual
{
"user": {
- "name": "Elin"
+ "name": "Cedric"
- "age": 30,
+ "age": 31,
}
}
...有点痛苦,因为要测试很多道具。
答案 0 :(得分:0)
我已经编写了一个函数,在初始测试中看起来就像你需要的那样。应该合理地直接向其添加错误日志。
function deepPartiallyEqual(spec, obj){
if (typeof(spec) != 'object' || typeof(obj) != 'object'){
return false;
}
for (var key in spec){
if(!obj.hasOwnProperty(key)){
return false;
}
if(typeof(spec[key]) === 'object'){
if (!deepPartiallyEqual(spec[key], obj[key])){
return false;
}
}
else if(spec[key] !== obj[key]){
return false;
}
}
return true;
};
修改强>
Lodash的isMatch
尽管没有错误消息传递,但仍能满足您的需求。 (Docs)
var object = { 'a': 1, 'b': 2 };
_.isMatch(object, { 'b': 2 });
// => true
_.isMatch(object, { 'b': 1 });
// => false