2013-05-11 3 views
6

Mój przykład szpiegowania metody kończy się niepowodzeniem z opcją "Oczekiwano przeszukania szpiega". kiedy to powinno minąć. Jednak otrzymuję dziennik konsoli "Foo handle_click named!", Więc wiem, że jest wywoływany.Problemy z Jasmine's spyOn toHaveBeenComed na prototypowej metodzie

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

Używam jaśmin-1.2.0, jasmin-html i jaśmin-jquery, ale nie jaśmin-sinon; przynajmniej nie sądzę, że jest tam w pakiecie. Każda pomoc jest doceniana!

Aktualizacja Odpowiedź została udzielona poniżej. Jednak chciałem udokumentować rozwiązanie w przypadku jQuery plugin:

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

Odpowiedz

2

Problemem jest to, że wiążą handle_click funkcja w konstruktorze. Tak więc po utworzeniu nowej instancji odwołanie do funkcji jest wiązane z wydarzeniem. Potem wymienisz foo.handle_click na szpiega. Ale nie wpłynie to na działanie funkcji związanej z wydarzeniem, ponieważ jest to nadal twoja pierwotna funkcja. Przed utworzeniem instancji musisz szpiegować funkcję Foo.prototype.handle_click, aby funkcja szpiega mogła zostać powiązana ze zdarzeniem.

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

Nice! Zgodnie z twoją sugestią dodałem prototyp do mojej wtyczki jQuery, więc było dostępne, aby przypisać szpiega przed jego utworzeniem: '$ .fn.foo = function (options) {return new Foo (this, options || {}); }; ' ' $ .fn.foo = Foo.prototype; ' Dzięki! –

Powiązane problemy