我正在使用Jasmine来测试Require.js模块中的Backbone.js视图。
如果我没有在匿名函数中包装回调,为什么我的测试会失败?
以下是测试:
describe("view extension", function () {
// extendedView is an instance of ExtendedView()
spyOn(extendedView, 'onOpen');
// open the element, which should trigger an event
extendedView.open();
expect(extendedView.onOpen).toBeDefined();
expect(extendedView.onOpen).toHaveBeenCalled();
});
出现故障:
var BaseView = Backbone.View.extend({
open: function () {
this.trigger('open');
}
});
var ExtendedView = BaseView.extend({
initialize: function () {
var self = this;
self.on('open', self.onOpen);
},
onOpen: function() {
console.log('I heard myself open');
}
});
在.initialize()
中传递以下修订版:
self.on('open', function () { self.onOpen() });
答案 0 :(得分:1)
它无法正常工作的原因是您正在实例上安装间谍,并在绑定事件处理程序后执行此操作。事件的顺序大致如下:
将创建将分配给extendedView
的实例,以便ExtendedView
' initialize
方法执行self.on('open', self.onOpen);
。 当时 self.onOpen
评估ExtendedView
类定义的原始函数。
然后在extendedView.onOpen
上设置间谍。这会将onOpen
的{{1}}(以及extendedView
的仅)的值更改为新间谍的值。
extendedView
被调用。由于extendedView.open()
最初是为self.on
类设置self.onOpen
的值而调用的,因此原始函数被称为不现在驻留在ExtendedView
的间谍。
使用匿名函数时它起作用的原因是,只要extendedView.onOpen
事件发生,匿名函数就会获得self.onOpen
的值,这在测试中意味着获得此值之后你已经设置了间谍。
您必须监视类方法而不是实例。类似的东西:
open