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的方法,而不是显式beforeEach
和afterEach
,所以这将是很好的得到这个工作。
sinon.js文档( http://sinonjs.org/docs/#sandbox )指出:
所以如果你不想手动恢复(),你必须使用this.spy()而不是sinon.spy()(和存根,模拟)。
这可能有助于解决您的问题。
除此之外,请允许我提及我通常使用这样的一个sinon沙箱:
var sinon = require('sinon').sandbox.create();
这允许我做一个普通的
afterEach(function () { sinon.restore(); });
而不需要保留对我所有存根的引用并单独恢复它们。