2013-05-11 5 views
6

私のメソッドに対するスパイの例は、「spy handle_clickが呼び出されたと期待されています。それが通過すべきとき。しかし、コンソールログ "Foo handle_click called!"が表示されているので、呼び出されていることがわかります。プロトタイプのメソッドでJasmineのspyOn toHaveBeenCalledに関する問題

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:ジャスミン-sinon

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; ' ありがとう! –

関連する問題