2015-10-13 97 views

回答

4

我不认为这确实让很多的意义,因为如果你用另一个存根替换存根..那你为什么不用第一个存根来实现你想要做的第二个存根。

反正,所述sinon.stub(object, "method", func)将执行以下操作,根据该文档:

替换object.methodfunc,包裹在间谍。像往常一样,object.method.restore();可以用来恢复原来的方法。

所以,如果你想更换一个存根实例的存根功能,那么你为什么不这样做:

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

或者,如果你想创建一个间谍代替存根:

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

在调用a.method = sinon.stub()之前,调用a.method.restore()很重要。 – Ajitesh

+1

这个答案让我走上了正轨。虽然这是回答'sinon.stub(object,“method,fn)'已被弃用。我们现在可以使用'sinon.stub(object,“method”)。callsFake(function(){// do stuff});'See [here](http://sinonjs.org/releases/v2.3.1/stubs #stubcallsfakefakefunction) _Edit:fixed url_ –

+0

@PhilD。你是对的,但问题本身是要求'sinon.stub(object,“method”,fn)',所以我认为我不会在答案中包含这些信息。 – g00glen00b

7

磕碰使用sinon.createStubInstance(MyConstructor)或整个对象后sinon.stub(obj)只能通过两种分配一个新的存根属性(如@ g00glen00b描述)或重新磕碰之前恢复存根更换存根。

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

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

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