assert.deepPartiallyEqual函数用于两个对象的

时间:2017-04-11 13:40:20

标签: javascript node.js unit-testing assert

我很难在这里找到好名字,但我会描述我想要的东西:

断言函数,例如节点assert.deepEqual(obj1, obj2),但不是递归地将obj1obj2进行比较,而是应该有这样的签名:deepPartiallyEqual(spec, obj)并且只检查{{1} "适合"在specobj"符合"如果您愿意,可以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,
      }
   }

...有点痛苦,因为要测试很多道具。

1 个答案:

答案 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