2014-07-10 36 views
2

我正在使用nodeunit对一些Javascript对象运行测试。在某些时候,我有去像这样验证:如何跳过对象的nodeunit deepEqual测试中的时代字段?

test.deepEqual(originalObject, testObject, 'Sentiment validation'); 

我大约验证的样子,这些的对象:

var originalObject = { 
    "sentiments": [ 
    { 
     "sentiment": "negative", 
     "user": { 
     "_id": null, 
     "type": "machine" 
     }, 
     "timestamp": 1404775102 
    } 
    ] 
}; 

var testObject = { 
    "sentiments": [ 
    { 
     "sentiment": "negative", 
     "user": { 
     "_id": null, 
     "type": "machine" 
     }, 
     "timestamp": 1405004493 
    } 
    ] 
}; 

我的测试总是失败,因为在动态的timestamp场创建的对象(在这种情况下为testObject)总是不同的;有没有办法告诉deepEqual方法跳过那个单一字段?

+0

我不知道你的问题的正确解决方案,但你不能有一个函数,并让该函数修改你的对象,并断言这些对象。 – Mritunjay

+0

如果你想要这个选项,我可以试试。 – Mritunjay

回答

1

你可以试试这个。

我没有在原始的两个对象上调用断言,但我调用了一个修改原始对象并在修改后的两个对象上声明的函数。

功能,这将删除时间戳

var getObjectWithoutTimestamp = function(obj){ 
    var result = {}; 
    //map is because if there are more than one sentiment in array. 
    result["sentiments"] = obj.sentiments.map(function(sentiment){ 
     var sntmnt = {}; 
     var user = {"_id":sentiment.user._id,"type":sentiment.user.type}; 
     sntmnt["sentiment"] = sentiment.sentiment; 
     sntmnt["user"] = user; 
     return sntmnt; 
    }); 
    return result; 
}; 

功能,这将改变原来的对象,然后调用断言。

var assertObjects = function (expected,actual) { 
    //// get object excluding timestamp 
    var expectedModified = getObjectWithoutTimestamp(expected); 
    var actualModified = getObjectWithoutTimestamp(actual); 
    // assert on these two objects. I tried with nodejs assert. 
    require('assert').deepEqual(expectedModified,actualModified); 
} 

对原始对象调用assertObject函数。

assertObjects(testObject,originalObject); 

可能有更好的方法来做到这一点。所以任何改进/帮助将不胜感激。

+0

感谢您的回答。是的,我已经做了一些非常类似于你的建议的东西:我创建了一个函数来验证JSON结构和一些实际值,并且返回true或false,并对结果执行标准test.equal()。 –

+0

@ÓscarPalacios好,让这个问题打开。愿你能得到更好的答案。 – Mritunjay