Javascript Sinon存根作为参数传递的函数

Javascript Sinon存根作为参数传递的函数,javascript,node.js,testing,sinon,stub,Javascript,Node.js,Testing,Sinon,Stub,我有以下示例类: function Example() {...} Example.prototype.someFunc1() {...} Example.prototype.someFunc2() {...} Example.prototype.func(func) {var res = func(); ...} 我通常调用示例#func(),如下所示: var example = new Example(); example.func(example.someFunc1) // or li

我有以下示例类:

function Example() {...}
Example.prototype.someFunc1() {...}
Example.prototype.someFunc2() {...}
Example.prototype.func(func) {var res = func(); ...}
我通常调用
示例#func()
,如下所示:

var example = new Example();
example.func(example.someFunc1)
// or like this, depending on what I want
example.func(example.someFunc2)
现在,在我的测试中,我将stub
示例#someFunc1()
如下所示:

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

问题是,
示例#someFunc1()
并没有以这种方式存根并正常调用。在这种情况下我能做什么?

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

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

存根函数不会在存根时消失,这就是为什么以后可以
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,你的小提琴与你发布的原始代码相差甚远


不清楚您要测试的是什么:您传递了一个函数引用–这可能是任何旧函数,无论它是否附加到
示例
对象,例如,匿名函数都可以


如果被测函数本身调用了存根函数,则存根是有意义的。

@DaveNewton我做了一把小提琴:是的,我不知道我在想什么,我只是想单元测试#logic()并隔离它,所以我把它存根了,我应该像你说的那样通过任何存根。。谢谢:)