3

我正在尝试测试当我的模型触发事件时是否调用视图方法。但这是行不通的——我已经不知道为什么会这样了。这是不起作用的代码:

看法:

class View extends Backbone.View
  initialize: ->
    @.listenTo @model, 'request', @disableForm, @

  disableForm: ->
    console.log 'disableForm'

茉莉花测试:

describe "AJAX events", ->

  it "when starting an AJAX request, disable the form", ->
    model = new Backbone.Model()
    view = new Backbone.View( { model: model })
    view.render()

    spyOn(view, 'disableForm')
    view.delegateEvents()

    model.trigger 'request'
    expect(view.disableForm).toHaveBeenCalled()

此代码在浏览器中运行良好。

另外——当我运行测试时,console.log 确实打印了“disableForm”——所以模型事件触发了对 disableForm 的调用,但是我的间谍没有接受这个(我的期望失败了)。我曾尝试将其放入 waitsFor 方法中,但他也没有任何作用。

有什么想法我哪里出错了吗?

4

3 回答 3

8

问题是spyOn它将用函数替换disableForm您视图中的spy函数。但是此时模型是绑定到原来的函数上的,所以替换视图中的函数对绑定到事件监听器的函数没有影响。当您在模型上触发事件时,将调用原始函数而不是间谍。

于 2013-04-25T21:28:03.487 回答
0

可能是并发问题。与其使用集成测试,不如disableForm直接对方法进行单元测试,然后测试是否initialize进行了正确的绑定(或者更好的是,使用Backbone.View.events散列)。

view.delegrateEvents()此外,在您的测试中似乎没有必要调用 to 。这是因为默认情况下Backbone会在视图实例化时调用delegateEvents并且它只与events散列交互,而散列似乎没有被使用。

于 2013-04-25T20:52:19.930 回答
0

上面的答案正确地阐明了为什么会发生这种情况:函数在初始化时绑定,spy 在绑定后替换函数,因此在触发事件时调用原始函数。

一个比在测试设置(初始化之前)替换原型函数更简单的解决方案是将匿名函数绑定到事件并在其中调用视图的函数。

@listenTo(model, event, => @viewFunction())

我不确定性能权衡是什么。

于 2015-11-27T15:52:13.210 回答