13

私は単純なクリックハンドラーを書いていて、イベントを渡す必要があります(そのように)

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

現在、私のジャスミン仕様では、呼び出されると予想される関数をスパイするものがあります(ただし、引数なしではなくeで呼び出されるため、アサーションは失敗します)

    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」を期待どおりに機能するように修正するにはどうすればよいですか?


アップデート

受け入れられた答えをそのまま使用することはできませんでしたが、少し変更することができました。以下は、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();
    });
4

2 に答える 2

16

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

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

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

于 2012-07-18T19:07:27.510 に答える
2

jQueryを使用できない場合は、その戻り値を使用して確認できます(この回答dispatchEventに基づく)。

const domElem = document.getElementById('some_dom_element');
const clickEvent = new MouseEvent('click', {
  view: window,
  bubbles: true,
  cancelable: true
});

const cancelled = !domElem.dispatchEvent(clickEvent);
expect(cancelled).toBeTruthy();
于 2019-11-08T13:18:18.843 に答える