Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用sinon.js模拟/存根回调函数?_Javascript_Qunit_Sinon - Fatal编程技术网

Javascript 如何使用sinon.js模拟/存根回调函数?

Javascript 如何使用sinon.js模拟/存根回调函数?,javascript,qunit,sinon,Javascript,Qunit,Sinon,我想用QUnit和Sinon.Js编写单元测试。我有一个应用程序,用户可以点击一个按钮和一个模式对话框来处理下载一些文件。用户可以关闭对话框,它会触发一个方法来运行以重置一些变量。我的测试代码: $(function() { $.fn.copy_button = function(){}; ln_download_view = new DownloadModalView(); ln_download_view.modal = {'modal': function() {

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

我还没有深入的理解。

你不能模拟/存根匿名函数。但是您可以进行重构并对命名回调进行存根/模拟

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

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

// ...

sinon.stub(onHide);

以下是我的方法:

在“每个之前”中,创建一个不做任何事情的函数:

var doNothing = function(){};
然后在测试中,监视:

var spy = sinon.spy(this, 'doNothing');
然后调用您的方法,传入引发doNothing方法的回调:

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

哦,我明白了。还有一件事。当单击发生时,应在调用on hide之后立即调用。我的测试应该期望两个函数调用,一个调用modal,一个调用onHide,但是modal应该触发onHide。但是因为模态被嘲笑,它就不起作用了。覆盖download_modal_dialog.modal与调用onHide的函数相等是否好?非常感谢。然后使用
sinon.spy
,这样它就可以像预期的那样工作了。还有一个问题吗?调用onHide()和调用\u hide\u spy.call()之间有什么区别。(var on_hide_spy=sinon.spy(onHide);)
.call
只允许您在特定上下文中调用函数。以上内容不再适用于Sinon 2.3.8
var a=function(){};var spy=si.spy(这个,a)抛出:
TypeError:试图将未定义的属性函数(){}包装为函数