似乎sinon可能无法正确恢复存根原型。在我将其报告为错误之前,有人可以告诉我,如果我做错了吗?
以下代码似乎正确存根net.Socket.prototype.connect,但没有正确恢复它:后续测试 - 与此代码无关,但依赖于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() ...)
,它应该创建并恢复沙箱。
另一方面,以下代码正确恢复存根,我的测试套件的其余部分继续运行:
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);
});
这是我的错误或驾驶舱错误吗?我更喜欢包装函数方法而不是显式beforeEach
和afterEach
,所以最好让它工作。
答案 0 :(得分:1)
sinon.js文档(http://sinonjs.org/docs/#sandbox)声明:
所以如果你不想手动恢复(),你必须使用this.spy()而不是sinon.spy()(和stub,mock)。
这可能会对您的问题有所帮助。
除此之外,请允许我提一下我通常使用这样的sinon沙箱:
var sinon = require('sinon').sandbox.create();
这允许我做一般的
afterEach(function () {
sinon.restore();
});
无需维护对所有存根的引用并单独恢复它们。