在NodeJS Test中未修改的测试对象

时间:2014-01-24 21:57:36

标签: node.js unit-testing mocha sinon

我正试图找到测试对象的最佳方法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的解决方案(已经用于间谍/存根功能)?

1 个答案:

答案 0 :(得分:0)

在我看来,如果一个对象不是一个大对象,那么克隆它(或它的一部分)会更好,顺便说一下,在nodejs utils中有一个有用的(但未记录的)函数是'_extend'这对你有用。

但实际上,我觉得您不应该在模块的范围内执行此操作(或实现任何类型的测试),并且只有在您将其公开以供其他模块使用时才传递对象的副本。这是因为,理想情况下,您会知道您的代码是如何工作的,并且不会滥用它,从而避免通过大量有效性检查来减慢它,并且只对来自外部的引入错误保持警惕。