sinon没有正确恢复stubbed原型的方法?

看起来,sinon可能不会正确地恢复残桩原型。 在我作为一个bug报告之前,有人可以告诉我,如果我做错了什么?

这失败了:

下面的代码似乎正确存根net.Socket.prototype.connect,但不正确地恢复它:后续testing – 与此代码无关,但依赖net.Socket – 开始失败:

it('passes host and port to the net.Socket().connect()', sinon.test(function() { var stub = sinon.stub(net.Socket.prototype, 'connect'); var host = '11.22.33.44'; var port = 1234; var il = new InstrumentLink(host, port); expect(stub).to.have.been.calledWith(host, port); })); 

请注意,我正在使用“包装函数” sinon.test(function() ...)来创build和还原沙箱。

这工作:

另一方面,下面的代码正确地恢复了存根,我的testing套件的其余部分继续运行:

 var stub; beforeEach(function() { stub = sinon.stub(net.Socket.prototype, 'connect'); }); afterEach(function() { stub.restore(); }); it('passes host and port to the net.Socket().connect()', function() { stub = sinon.stub(net.Socket.prototype, 'connect'); var host = '11.22.33.44'; var port = 1234; var il = new InstrumentLink(host, port); expect(stub).to.have.been.calledWith(host, port); }); 

问题是:

这是我的错误或驾驶舱错误? 我更喜欢包装function的方法,而不是显式beforeEachafterEach ,所以这将是很好的得到这个工作。

sinon.js文档( http://sinonjs.org/docs/#sandbox )指出:

所以如果你不想手动恢复(),你必须使用this.spy()而不是sinon.spy()(和存根,模拟)。

这可能有助于解决您的问题。

除此之外,请允许我提及我通常使用这样的一个sinon沙箱:

 var sinon = require('sinon').sandbox.create(); 

这允许我做一个普通的

  afterEach(function () { sinon.restore(); }); 

而不需要保留对我所有存根的引用并单独恢复它们。