我对一个方法进行间谍活动的例子失败了,“已经调用了预期的间谍handle_click”。什么时候应该通过。但是,我收到控制台日志“Foo handle_click called!”,所以我知道它正在调用。
Foo.js
function Foo() {
this.$btn = $('<a href="#">Foo</a>');
this.$btn.on('click', this.handle_click);
};
Foo.prototype.handle_click = function(evt) {
evt.preventDefault();
console.log('Foo handle_click called!');
};
Foo_spec.js:
it('should be called when trigger is clicked', function() {
var foo = new Foo();
spyOn( foo, 'handle_click' ).andCallThrough();
foo.$btn.click();
expect( foo.handle_click ).toHaveBeenCalled();
});
我使用的是jasmine-1.2.0,jasmin-html和jasmine-jquery,但不是jasmine-sinon;至少我不认为它捆绑在那里。非常感谢任何帮助!
更新 这在下面得到了回答。但是,我想在jQuery插件的情况下记录解决方案:
Foo.js:
function Foo() { ... }
Foo.prototype.handle_click = function(evt) { ... }
$.fn.foo = function(options) {
return new Foo(this, options || {});
};
$.fn.foo.prototype = Foo.prototype;
Foo_spec.js:
it('should be called when clicked', function() {
spyOn( $.fn.foo.prototype, 'handle_click');
var plugin = $('#selector-for-plugin').foo();
plugin.$btn.click();
expect( plugin.handle_click ).toHaveBeenCalled();
});
答案 0 :(得分:2)
问题是您在构造函数中绑定了handle_click
函数。因此,当您创建新实例时,对该函数的引用将绑定到该事件。之后,用间谍替换foo.handle_click
。但这不会影响绑定到事件的功能,因为这仍然是您的原始功能。在创建实例之前,您必须监视Foo.prototype.handle_click
函数,因此可以将spied函数绑定到事件。
it('should be called when trigger is clicked', function() {
spyOn( Foo.prototype, 'handle_click' );
var foo = new Foo();
foo.$btn.click();
expect( foo.handle_click ).toHaveBeenCalled();
});