【问题标题】:Sinon spy method that is called in backbone view initialize在主干视图初始化中调用的 Sinon spy 方法
【发布时间】:2012-11-13 22:05:12
【问题描述】:

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

但是测试失败了……

有什么想法吗?

【问题讨论】:

    标签: backbone.js jasmine sinon


    【解决方案1】:

    您需要返回视图的实例,以便调用初始化方法。

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

    【讨论】:

    • 你好,我用new创建了一个新实例
    【解决方案2】:

    你在监视这个方法太晚了。

    无论你在哪里分配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();
    });
    

    【讨论】:

    • 有没有办法提前窥探?也许可以窥探 Backbone.View 的原型?
    • 也许吧。尝试类似我添加的内容。我真的不建议这样做。它开始变得有点讨厌,并且可能不会真正给您提供那么多测试。
    猜你喜欢
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2013-01-13
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多