我正试图找到测试对象的最佳方法params不会被函数改变。
想象一下这个函数什么都不做:
function underTest (someObject) {
//It does nothing
}
现在我想测试arg没有被函数中和。 我知道几乎没有人会做那样的测试,但我是一个整体(和一个菜鸟^^)
it("Do not modify params", function () {
var myObj = { property : 1, other : 3};
underTest(myObject);
//??? So
});
问题是:你将如何实现这一目标?
重复对象?
it("Do not modify params", function () {
var myObj = { property : 1, other : 3};
underTest(myObject);
assert.deepEqual({ property : 1, other : 3}, myObj);
});
在使用函数之前使用框架克隆它?
it("Do not modify params", function () {
var myObj = { property : 1, other : 3};
var clone = clonerFunction(myObj);
underTest(myObj);
assert.deepEqual(clone, myObj);
});
sinonJS的解决方案(已经用于间谍/存根功能)?
答案 0 :(得分:0)
在我看来,如果一个对象不是一个大对象,那么克隆它(或它的一部分)会更好,顺便说一下,在nodejs utils中有一个有用的(但未记录的)函数是'_extend'这对你有用。
但实际上,我觉得您不应该在模块的范围内执行此操作(或实现任何类型的测试),并且只有在您将其公开以供其他模块使用时才传递对象的副本。这是因为,理想情况下,您会知道您的代码是如何工作的,并且不会滥用它,从而避免通过大量有效性检查来减慢它,并且只对来自外部的引入错误保持警惕。