在骨干视图中调用的Sinon间谍方法初始化

时间:2012-11-26 12:16:50

标签: backbone.js jasmine sinon

我在Backbone的View初始化方法中执行一个方法。

initialize : function(options) {
      this.myMethod();
   }

我试图使用sinon来监视这个方法:

this.spyMyMethod = sinon.spy(this.view, "myMethod");

结束

it('should call my method', function(){
  expect(this.spyMyMethod).toHaveBeenCalledOnce();
});

但测试失败了......

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

你太晚监视这个方法了。

无论您在何处分配this.view,我都认为它来自new Views.SomeView()之类的呼叫。 new调用将使initialize函数执行。

<强>更新

我真的不推荐这样做,因为它非常混乱,但你可能会做类似下面的事情:(我不知道sinon但是这就是你用基础茉莉花间谍对象做的事情)< / p>

it('should call my method', function(){
  var dummyView = new Views.SomeView();
  spyOn(dummyView, "myMethod");
  spyOn(Views, "SomeView").andCallFake(function () {
    dummyView.initialize();
    return dummyView;
  });
  new Views.SomeView();
  expect(dummyView.myMethod).toHaveBeenCalled();
});

另一个Possiblilty

看起来可以用下面的间谍覆盖该方法。如果可行,那可能是最干净的方法。

it('should call my method', function(){
  spyOn(Views.SomeView.prototype, "myMethod");
  new Views.SomeView();
  expect(Views.SomeView.prototype.myMethod).toHaveBeenCalled();
});

答案 1 :(得分:0)

您需要为要调用的initialize方法返回视图的 new 实例。

我不确定this.view = new View();但是已经