如何使用sinon.js实现mock/stub回调函数

How to mock/stub callback function with sinon.js?

本文关键字:stub 回调 函数 mock 实现 何使用 sinon js      更新时间:2023-09-26

我想用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);
});

我还没有深刻的理解。

您不能模拟/存根一个匿名函数。但是,您可以对命名回调进行重构和stub/mock。

$('.download-modal').on('hide', onHide);
var onHide = function() {
    window.clearInterval(window.periodicalTimer);
};
// ...
sinon.stub(onHide);

下面是我的方法:

在你的before-each中,制作一个什么都不做的函数:

var doNothing = function(){};

然后在你的测试中,窥探一下:

var spy = sinon.spy(this, 'doNothing');

然后调用您的方法,传入一个回调,该回调将触发doNothing方法:

  var self = this;
  whatever.doSomethingAwesome(
  {
    finished: function(){
      self.doNothing();
    }
  });
  expect(spy.callCount).toEqual(1);