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

如果我通过var a = sinon.createStubInstance(MyContructor)创build一个实例。

我怎样才能取代一个var stub = sinon.stub(object, "method", func);函数像var stub = sinon.stub(object, "method", func);

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

       

网上收集的解决方案 "在使用Sinon时,如何replace存根实例中的存根函数?"

我不认为这样做有很大的意义,因为如果你用另一个存根replace一个存根,那么为什么不用第一个存根来实现你想要做的第二个存根。

无论如何, sinon.stub(object, "method", func)根据文档进行以下操作:

用一个包含在间谍中的func替代object.method 。 像往常一样, object.method.restore() ; 可以用来恢复原来的方法。

所以,如果你想replace一个存根实例的存根函数,那么你为什么不做:

 var a = sinon.createStubInstance(MyConstructor); a.method = sinon.spy(function() { return "Foo Bar"; }); 

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

 var a = sinon.createStubInstance(MyConstructor); a.method = sinon.stub(); 

在使用sinon.createStubInstance(MyConstructor)sinon.stub(obj)对整个对象进行存根化之后,只能通过为属性分配新的存根(如@ g00glen00b所述)或在重新存根之前还原存根来replace存根。

 var a = sinon.createStubInstance(MyConstructor); a.method.restore(); sinon.stub(object, "method", func); 

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

如果Stub API有一个.call(func)方法来覆盖事实之后由存根调用的函数,那将会更方便一些。