用sinon对原型方法进行拼接

Abr*_*m P 8 javascript prototype mocha.js stubs sinon

假设我有以下方法:

Controller.prototype.refresh = function () {
  console.log('refreshing');
}

Controller.prototype.delete = function (object) {
  var self = this;
  object.delete({id: object.id}, function () {
    self.refresh();
  });
}
Run Code Online (Sandbox Code Playgroud)

现在在我的(摩卡)测试中:

beforeEach(function () {
  var controller = new Controller();
  var proto = controller.__proto__;
  var object = {id: 1, delete: function (options, callback) { callback (); };
  sinon.stub(proto, 'refresh', function {console.log('refreshing stub')});
  controller.delete(object);
});

it('doesnt work', function () {
  expect(object.delete.callCount).to.equal(1);
  expect(proto.refresh.callCount).to.equal(1);
});
Run Code Online (Sandbox Code Playgroud)

但是,这会向控制台打印"刷新".有没有办法使用sinon存根现场原型?

JME*_*JME 5

这就是我要做的:

describe('test', function() {
  before(function() {
    // stub the prototype's `refresh` method
    sinon.stub(Controller.prototype, 'refresh');
    this.object = {
      id: 1,
      delete: function (options, callback) { callback (); }
    };
    // spy on the object's `delete` method
    sinon.spy(this.object, 'delete');
  });

  beforeEach(function () {
    // do your thing ...
    this.controller = new Controller();
    this.controller.delete(this.object);
  });

  after(function() {
    // restore stubs/spies after I'm done
    Controller.prototype.refresh.restore();
    this.object.delete.restore();
  });

  it('doesnt work', function () {
    expect(this.object.delete.callCount).to.equal(1);
    expect(this.controller.refresh.callCount).to.equal(1);
  });
});
Run Code Online (Sandbox Code Playgroud)