35

我有两个问题:

您可以在 qunit 中进行参数化单元测试吗?

您如何使用 qunit 进行模拟,例如模拟getJSON呼叫?

谢谢

4

5 回答 5

50

对于模拟 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 函数的值 - 调用成功回调并断言它做了它应该做的事情

于 2010-01-24T09:07:08.413 回答
15

除了重写 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。

于 2012-07-16T15:01:35.223 回答
5

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

于 2011-02-21T23:59:32.010 回答
4

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

于 2012-11-15T10:20:53.670 回答
1

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

于 2010-02-18T13:34:21.297 回答