3

QUnit と Sinon.Js で単体テストを書きたいです。ユーザーがボタンをクリックすると、モーダルダイアログが表示され、いくつかのファイルのダウンロードを処理できるアプリケーションがあります。ユーザーがダイアログを閉じると、いくつかの変数をリセットするために実行するメソッドがトリガーされます。私のテストコード:

$(function() {
    $.fn.copy_button = function(){};

    ln_download_view = new DownloadModalView();
    ln_download_view.modal = {'modal': function() {}};
    var download_modal_dialog = $('.download-modal');
    download_modal_dialog.modal = function(param){};
    var modal_mock = sinon.mock(ln_download_view.modal);
    var download_modal_dialog_mock = sinon.mock(download_modal_dialog);

    //Should be inserted, because ln_download_view.modal is mocked
    //The close button even handler
    $('#btn_close_modal').click(function(){
        download_modal_dialog.modal('hide');
    });

    //Dirty stuff to do after the window closes
    //Basicly the click triggers this event handler
    $('.download-modal').on('hide',function() {
        window.clearInterval(window.periodicalTimer);
    });

    $('div .option-container').click(function() {
        if(!$(this).hasClass("selected-option"))
        {
            $('div #option-presenting').toggleClass("selected-option");
            $('div #option-editing-and-presenting').toggleClass("selected-option");

            $('.image').toggle();
        }
    });

    module("views");
    test("Download modal dialog is displayed", function(){
        var modal_triggered = modal_mock.expects("modal").once();
        ln_download_view.handleDownloadClick();
        ok(modal_triggered.verify());
    });

    test("Download modal dialog is closed",function(){
        var modal_triggered = download_modal_dialog_mock.expects("modal");
        $('#btn_close_modal').trigger('click');
        ok(modal_triggered.verify());
    });
});

私が理解していないのは、このコードをテスト/モック/スタブするにはどうすればよいかということです:

$('.download-modal').on('hide',function() {
    window.clearInterval(window.periodicalTimer);
});

私はまだ深い理解を持っていません。

4

2 に答える 2

5

匿名関数をモック/スタブすることはできません。ただし、名前付きコールバックをリファクタリングしてスタブ/モックすることはできます。

$('.download-modal').on('hide', onHide);

var onHide = function() {
    window.clearInterval(window.periodicalTimer);
};

// ...

sinon.stub(onHide);
于 2013-08-14T21:00:43.457 に答える