2012-07-17 12 views
12

私は、単純なクリックハンドラを書いているとイベントが呼び出されます、私は期待して機能をスパイするために何かを持っている私のジャスミンの仕様で現在jasmineを使ってクリックするとスパイがアサートされます。

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

(そのような)に渡される必要があります(それはだから私の主張をargs-せずに電子の-notと呼ば

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

がどのように私は、この「toHaveBeenCalledWith」私は期待通りに動作するように修正することができます)失敗していますか?


UPDATE

ですが、私はほんの少しそれを変更することができましたし、以下の私の100%実施例であると、私は受け入れ答えを動作させることができなかった

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

答えて

13

stopPropagationメソッドのスパイを渡す独自のイベントをトリガーする必要があります。イベントが停止したかどうかをテストしたいからです。

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

注:あなたは、クラスの内部動作をテストするために開始するので、あなたが、あなたがテストしたいオブジェクトをスパイするときコードのにおいがあります。あなたの機能をブラックボックスと考え、あなたが出し入れしたものだけをテストしてください。あなたの場合、関数の名前を変更すると、コードは有効なままテストが中断されます。

関連する問題