2012-07-17 14 views
12

Piszę proste kliknięcie obsługi i musi wydarzenie przekazywane w (tak jakby)Jak zapewnić szpiegowi wywoływanie zdarzenia za pomocą kliknięcia za pomocą jaśminu?

Thing = function($){ 

    var MyObject = function(opts){ 
     this.opts = opts; 
    }; 

    MyObject.prototype.createSomething = function(){ 
     var that = this; 
     $('#some_dom_element').live('click', function(e) { 
      that.doStuff(e); 
     }); 
    }; 

    MyObject.prototype.doStuff = function(e) { 
     //do some javascript stuff ... 
     e.preventDefault(); 
    }; 

    return MyObject; 

}(jQuery); 

Obecnie w moim jaśminowym specyfikacji Mam coś do szpiegowania funkcji spodziewam zostanie wywołany (ale ponieważ jest to nazywa się e -nie bez args- moje twierdzenie zawodzi)

it ("live click handler added to the dom element", function(){ 
     var doSpy = spyOn(sut, 'doStuff'); 
     sut.createSomething(); 
     $("#some_dom_element").trigger('click'); 
     expect(doSpy).toHaveBeenCalledWith(); 
    }); 

jak mogę rozwiązać ten „toHaveBeenCalledWith” do pracy, jak ja się spodziewać?


UPDATE

nie mogłem dostać zaakceptowana odpowiedź pracować jak jest, ale byłem w stanie zmienić go tylko trochę, a poniżej jest moje 100% Przykład pracy

it ("should prevent default on click", function(){ 
     var event = { 
      type: 'click', 
      preventDefault: function() {} 
     }; 
     var preventDefaultSpy = spyOn(event, 'preventDefault'); 
     sut.createSomething(); 
     $("#some_dom_element").trigger(event); 
     expect(preventDefaultSpy).toHaveBeenCalledWith(); 
    }); 

Odpowiedz

13

Musisz wywołać własne zdarzenie przekazując szpiega dla metody stopPropagation, ponieważ chcesz sprawdzić, czy zdarzenie zostało zatrzymane.

var event = { 
    type: 'click', 
    stopPropagation: function(){} 
} 
var spy = spyOn(event, 'stopPropagation'); 
$('#some_dom_element').trigger(event); 
expect(spy).toHaveBeenCalled(); 

Uwaga: istnieje zapachy kodu podczas szpiegowania na obiekt, który chcesz przetestować, bo zaczniesz testować wewnętrzną zachowanie swojej klasie. Pomyśl o swojej funkcji czarnej skrzynki i testuj tylko rzeczy, które wkładasz i wyjdź. W twoim przypadku zmiana nazwy funkcji spowoduje przerwanie testu, podczas gdy kod będzie nadal ważny.

Powiązane problemy