【问题标题】:Qunit parameterized tests and mockingQunit 参数化测试和模拟
【发布时间】:2009-02-06 22:16:53
【问题描述】:

我有两个问题:

你能在 qunit 中进行参数化单元测试吗?

您如何使用 qunit 进行模拟,例如嘲笑getJSON 电话?

谢谢

【问题讨论】:

    标签: javascript qunit


    【解决方案1】:

    对于模拟 ajax 请求,您可以尝试这样的事情...

    这是您要测试的功能:

        var functionToTest = function () {
            $.ajax({
                url: 'someUrl',
                type: 'POST',
                dataType: 'json',
                data: 'foo=1&foo=2&foo=3',
                success: function (data) {
                    $('#main').html(data.someProp);
                }
            });
        };
    

    这是测试用例:

        test('ajax mock test', function () {
            var options = null;
            jQuery.ajax = function (param) {
                options = param;
            };
            functionToTest();
            options.success({
                someProp: 'bar'
            });
            same(options.data, 'foo=1&foo=2&foo=3');
            same($('#main').html(), 'bar');
        });
    

    它本质上是覆盖 jQuery 的 ajax 函数,然后检查以下两件事: - 传递给 ajax 函数的值 - 调用成功回调并断言它做了它应该做的事情

    【讨论】:

    • 我花了大约半个小时才得到函数(param){options=param;},但后来它击中了我……真的很酷。
    • 如果您正在测试嵌套调用,是否最好将这些选项保存在一个数组中,并且每次调用 .push() 时将选项对象保存到该数组?
    • @James Kingsbery 如果你明白了,你能解释一下吗?
    【解决方案2】:

    除了重写 jQuery 的 AJAX 函数,您还可以使用 .appendTo 开发的 jQuery Mockjax 插件。这个插件基本上做了其他答案的建议,但它允许更复杂的模拟。例如,如果您有以下功能:

    $.ajax({
        url:"/api/user",
        type:"GET",
        dataType:"json",
        data:'{"uid":"foobar"}',
        success:function(data){
            console.log("Success!");
        },
        error:function(data){
            console.log("Error!");
        }
    });
    

    你可以用 mockjax 来模拟​​它,只需调用函数 mockjax,它会自动包含在 jQuery 中:

    $.mockjax({
        url:"/api/user",
        type:"GET",
        response:function(requestData){
             //handle the mock response in here
             this.responseText = '{"fullname":"Mr. Foo Bar"}';
        }
    });
    

    第二个模拟函数可以包含在一个外部 JavaScript 文件中,比如“mocks.js”,唯一需要做的就是包含 mockjax 库(可以在 https://github.com/appendto/jquery-mockjax/ 找到)。唯一要记住的是,这只会模拟 jQuery ajax 调用,而不是所有 XMLHttpRequest。如果您想这样做,请遵循 @bertvh 的建议并使用 Sinon.js。

    【讨论】:

    • +1 使用 mockjax。我刚刚开始使用它,它非常适合用于单元测试以及用于屏幕开发的虚拟数据。我遇到的唯一问题是 json 数据文件被 Chrome 浏览器缓存。清除缓存可修复任何陈旧文件问题。
    【解决方案3】:

    我刚开始使用Sinon.JS,它允许模拟 XMLHttpRequests 并且还提供了一个简单的假服务器 API。真的很容易使用!它还提供与 qunit 的集成。

    【讨论】:

      【解决方案4】:

      我的插件实现允许参数化 qunit 测试: https://github.com/AStepaniuk/qunit-parameterize

      【讨论】:

        【解决方案5】:

        查看此链接以在您的 setup/teardown 方法中模拟 getJSON 调用, http://www.ajaxprojects.com/ajax/tutorialdetails.php?itemid=505

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-09
          • 1970-01-01
          • 2012-08-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多