Javascript 用Jasmine监视事件回调
我正在使用Jasmine测试Require.js模块中的Backbone.js视图 如果我没有将回调封装在匿名函数中,为什么测试会失败 以下是测试:Javascript 用Jasmine监视事件回调,javascript,backbone.js,requirejs,closures,jasmine,Javascript,Backbone.js,Requirejs,Closures,Jasmine,我正在使用Jasmine测试Require.js模块中的Backbone.js视图 如果我没有将回调封装在匿名函数中,为什么测试会失败 以下是测试: describe("view extension", function () { // extendedView is an instance of ExtendedView() spyOn(extendedView, 'onOpen'); // open the element, which should trigger
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()
中传递以下版本:
它不起作用的原因是您正在实例上安装spy,并在绑定事件处理程序后执行此操作。事件的顺序大致如下:
extendedView
的实例,以便extendedView
的initialize
方法执行self.on('open',self.onOpen')代码>当时self.onOpen
计算为扩展视图
类定义的原始函数
extendedView.onOpen
上设置一个间谍。这将extendedView
的onOpen
值(以及extendedView
的值)更改为新spy的值self.on
时,为ExtendedView
类设置了self.onOpen
值,所以调用的是这个original函数,而不是现在驻留在ExtendedView.onOpen
中的间谍打开
事件时,匿名函数都会获取self.onOpen
的值,这在您的测试中意味着该值是在设置间谍后获得的
您必须监视类方法,而不是实例。比如:
spyOn(ExtendedView.prototype, 'onOpen');
[...]
expect(ExtendedView.prototype.onOpen).toBeDefined();
expect(ExtendedView.prototype.onOpen).toHaveBeenCalled();
试图使用
.prototype
访问类时,测试中会出现错误:spyOn无法为onOpen()找到要监视的对象。
。这可能是因为模块是通过require
拉入测试的。
spyOn(ExtendedView.prototype, 'onOpen');
[...]
expect(ExtendedView.prototype.onOpen).toBeDefined();
expect(ExtendedView.prototype.onOpen).toHaveBeenCalled();