Sinon将一个函数作为参数传递

时间:2016-08-20 14:31:13

标签: javascript node.js testing sinon stub

我有以下示例类:

function Example() {...}
Example.prototype.someFunc1() {...}
Example.prototype.someFunc2() {...}
Example.prototype.func(func) {var res = func(); ...}

我通常按以下方式致电Example#func()

var example = new Example();
example.func(example.someFunc1)
// or like this, depending on what I want
example.func(example.someFunc2)

现在我在测试中将Example#someFunc1()存根如下:

var example = new Example();
sinon.stub(example, 'someFunc1').returns(...);
exmaple.func(example.someFunc1);

问题是Example#someFunc1()没有以这种方式存根并被正常调用。在这种情况下我该怎么办?

1 个答案:

答案 0 :(得分:1)

在您的示例中,您保存对该函数的引用。然后你把它存根。

您正在传递对原始函数的引用,而不是存根函数。

你存根的功能在你存根时不会消失 - 这就是你以后可以restore()的原因。您需要传递对象函数本身的引用,例如

sinon.stub(example, 'opt1').returns(42);
example.logic([3, 2], example.opt1);

或者传递对存根的引用,例如,

var fn = sinon.stub(example, 'opt1').returns(42);
example.logic([3, 2], fn);

然而,后者作为测试并没有任何意义;你可以传递任何函数,没有理由存根。

FWIW,你的小提琴远不及你发布的原始代码。

目前还不清楚你要测试的是什么:你传递一个函数引用 - 这可能是任何旧函数,无论它是否附加到Example对象,例如,匿名函数都可以。< / p>

如果被测试的函数本身称为存根函数,则存根是有意义的。