2013-05-11 41 views
6

我的一個方法監視的例子是失敗,「期望spy handle_click被調用。」當它通過。但是,我得到控制檯日誌「Foo handle_click called!」,所以我知道它被調用。Jasmine's spyOn的問題有一個原型方法調用

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(); 
}); 

我用的茉莉-1.2.0,茉莉,html和茉莉花jQuery的,但不是茉莉花興農;至少我不認爲它捆綁在那裏。任何幫助深表感謝!

更新 這在下面得到了解答。不過,我想文檔中的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(); 
}); 

回答

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(); 
}); 
+0

不錯!根據你的建議,我將原型添加到了我的jQuery插件中,以便在實例化之前指定間諜: '$ .fn.foo = function(options){return new Foo(this,options || {}); };' '$ .fn.foo = Foo.prototype;' 謝謝! – 2013-05-12 13:08:10