6

メソッドをスパイする私の例は、「Expected spy handle_click to have been called.」で失敗しています。いつ通過すべきか。ただし、「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();
});
4

1 に答える 1

2

handle_click問題は、コンストラクターで関数をバインドすることです。したがって、新しいインスタンスを作成すると、関数への参照がイベントにバインドされます。その後、 をfoo.handle_clickスパイに置き換えます。ただし、これはまだ元の関数であるため、イベントにバインドされた関数には影響しません。Foo.prototype.handle_clickインスタンスを作成する前に関数をスパイする必要があるため、スパイされた関数をイベントにバインドできます。

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();
});
于 2013-05-12T07:01:25.397 に答える