sinon没有正确恢复短脚原型方法?

时间:2016-05-24 05:24:13

标签: javascript node.js mocha sinon

似乎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);
});

问题:

这是我的错误或驾驶舱错误吗?我更喜欢包装函数方法而不是显式beforeEachafterEach,所以最好让它工作。

1 个答案:

答案 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();
  });

无需维护对所有存根的引用并单独恢复它们。