1

我在 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();
});

但测试失败...

有任何想法吗?

4

2 回答 2

3

您在监视该方法为时已晚。

无论您在哪里分配this.view,我都认为它来自像new Views.SomeView(). 正是该new调用将initialize执行该函数。

更新

我真的不建议这样做,因为它非常混乱,但您可以执行以下操作:(我不知道 sinon,但这是您使用基本 jasmine 间谍对象的方式)

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

另一种可能性

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

it('should call my method', function(){
  spyOn(Views.SomeView.prototype, "myMethod");
  new Views.SomeView();
  expect(Views.SomeView.prototype.myMethod).toHaveBeenCalled();
});
于 2012-11-26T21:51:41.993 回答
0

您需要返回视图的实例才能调用初始化方法。

我不确定 this.view = new View(); 然而已经

于 2012-11-26T21:39:16.293 回答