使用Sinon时,如何在存根实例中替换存根函数?

Ste*_*enR 13 mocha.js node.js sinon nodeunit

如果我已经创建了一个实例 var a = sinon.createStubInstance(MyContructor).

我怎样才能替换其中一个存根函数var stub = sinon.stub(object, "method", func);.

我这样做的主要原因是希望实现多个回调解决方法,如上所述

g00*_*00b 15

我认为这没有多大意义,因为如果你用另一个存根替换存根...那你为什么不用第一个存根来实现你想用第二个存根做什么.

无论如何,sinon.stub(object, "method", func)根据文档做以下事项:

object.method用a 替换func,用间谍包裹.像往常一样object.method.restore(); 可用于恢复原始方法.

因此,如果要替换存根实例的存根函数,那么为什么不这样做:

var a = sinon.createStubInstance(MyConstructor);
a.method = sinon.spy(function() { return "Foo Bar"; });
Run Code Online (Sandbox Code Playgroud)

或者如果你想创建一个存根而不是间谍:

var a = sinon.createStubInstance(MyConstructor);
a.method = sinon.stub();
Run Code Online (Sandbox Code Playgroud)

  • 由于这个答案让我走上了正确的轨道,因此进行了投票.虽然因为这被回答`sinon.stub(object,"method",fn)`已被弃用.我们现在可以使用`sinon.stub(object,"method").callsFake(function(){// do stuff});`见[here](http://sinonjs.org/releases/v2.3.1/stubs #stubcallsfakefakefunction)_编辑:修复url_ (5认同)

flu*_*ngo 11

使用sinon.createStubInstance(MyConstructor)或使用或者sinon.stub(obj)只能通过为属性分配新存根(如@ g00glen00b所述)或在重新存根之前恢复存根来替换存根之后.

var a = sinon.createStubInstance(MyConstructor);
a.method.restore();
sinon.stub(object, "method", func);
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,您仍然可以a.method.restore()使用预期的行为进行调用.

如果Stub API有一个.call(func)方法来覆盖事实后被存根调用的函数会更方便.