Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing 触发主干模型事件don';不要在我的茉莉花间谍中注册_Testing_Backbone.js_Jasmine - Fatal编程技术网

Testing 触发主干模型事件don';不要在我的茉莉花间谍中注册

Testing 触发主干模型事件don';不要在我的茉莉花间谍中注册,testing,backbone.js,jasmine,Testing,Backbone.js,Jasmine,我试图测试当我的模型触发事件时是否调用视图方法。但这是行不通的——我也不知道为什么会这样。以下是不起作用的代码: 视图: 茉莉花试验: describe "AJAX events", -> it "when starting an AJAX request, disable the form", -> model = new Backbone.Model() view = new Backbone.View( { model: model }) view

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

视图:

茉莉花试验:

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的方法,但他的方法也没什么不同


你知道我哪里出错了吗?

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


此外,对
view.delegrateEvents()
的调用在测试中似乎是不必要的。这是因为在视图实例化时,
Backbone
默认情况下将调用
delegateEvents
,并且它只与
事件
哈希进行交互,它似乎没有被使用。

问题是
spyOn
将用
spy
功能替换您视图中的功能
disableForm
。但此时模型绑定到了原始函数,因此在视图中替换函数对绑定到事件侦听器的函数没有影响。当您在模型上触发事件时,将调用原始函数而不是spy。

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

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

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

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

啊,是的。这完全有道理。谢谢。在模块中测试组件的推荐方法是什么?我可以在每次测试之前启动和停止模块,但这并不能模拟实际的行为。我处理这一问题的方法是在测试的早期监视原型方法。So:spyOn(View.prototype,'disableForm');这确保了当您的方法被绑定时,它们被绑定到该方法的间谍版本。这不是很好,并且会导致封装性稍差的测试,但它是有效的。另一种方法是更改绑定的实现以接受方法名而不是函数引用。这样,您就可以对每个事件按名称调用该方法。但是更改绑定实现有点繁重!True-此处的delegateEvents实际上没有什么区别,因为它只是引用事件哈希。谢谢你。
@listenTo(model, event, => @viewFunction())