Javascript 测试初始化函数中设置的主干事件
我正在尝试设置我的收藏,以侦听在收藏中的模型上触发的事件,如下所示:Javascript 测试初始化函数中设置的主干事件,javascript,backbone.js,jasmine,Javascript,Backbone.js,Jasmine,我正在尝试设置我的收藏,以侦听在收藏中的模型上触发的事件,如下所示: var Collection = Backbone.Collection.extend({ initialize: function() { this.on('playback:completed', this.playNext); }, playNext : function() { } }); var Collection = Backbone.Collection.extend({ initia
var Collection = Backbone.Collection.extend({
initialize: function() {
this.on('playback:completed', this.playNext);
},
playNext : function() { }
});
var Collection = Backbone.Collection.extend({
initialize: function() {
this.bindEvents();
},
bindEvents : function() {
this.on('playback:completed', this.playNext);
},
playNext : function() { }
});
在我的测试中,我将新的主干.Models添加到集合的一个实例中,然后在它们上触发回放:completed
。。。并且不调用playNext
。如何正确设置此项
编辑:添加测试代码(使用Jasmine):
这里的问题是主干的
.on
将回调包装为克隆或类似的东西。由于spy是在Collection.initialize运行后设置的,因此包装的回调函数是设置spy之前的函数,它永远不会被触发
我确定的解决方案是将事件绑定拉入bindEvents
函数,如下所示:
var Collection = Backbone.Collection.extend({
initialize: function() {
this.on('playback:completed', this.playNext);
},
playNext : function() { }
});
var Collection = Backbone.Collection.extend({
initialize: function() {
this.bindEvents();
},
bindEvents : function() {
this.on('playback:completed', this.playNext);
},
playNext : function() { }
});
然后,在我的测试中(设置了间谍之后),我运行了
collection.off();collection.bindEvents()代码>,它将它们与间谍版本重新绑定。它应该可以工作:。问题来自其他方面。可能会发布更多的代码。非常奇怪——实际上没有更多的代码。我遗漏的唯一复杂之处是,这是一个Jasmine测试,playNext上有一个间谍。可能会添加触发事件的部分。奇怪的是,如果我在初始化函数之外编写事件侦听器(例如,collection.on('playback:completed',collection.playNext'),这会起作用
在测试主体中。初始化函数有问题吗?不应该有问题。唯一可能有问题的是上下文。但我不知道上下文怎么可能不是初始化函数中的对象本身(Jasmine可能有问题?)。