Qunit参数化测试和模拟

36

我有两个问题:

QUnit是否支持参数化单元测试?

如何使用QUnit进行模拟,例如模拟getJSON调用?

谢谢。

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函数的值 - 调用成功回调并断言它是否按预期执行


4
我花了大约半小时才理解了这个函数:function(param){options=param;},但后来我恍然大悟...真的很酷。 - James Kingsbery
如果您正在测试嵌套调用,这些选项最好保存在一个数组中,并且对于每个调用使用.push()将选项对象添加到该数组中? - StuperUser
1
@James Kingsbery 如果你懂了,能否解释一下? - dublintech

15

你可以使用jQuery Mockjax插件而不是覆盖jQuery的AJAX函数。该插件基本上实现了其他答案提供的功能,但它允许进行更复杂的模拟。例如,如果你有以下函数:

$.ajax({
    url:"/api/user",
    type:"GET",
    dataType:"json",
    data:'{"uid":"foobar"}',
    success:function(data){
        console.log("Success!");
    },
    error:function(data){
        console.log("Error!");
    }
});
您可以使用mockjax进行模拟,只需调用jQuery自动包含的函数mockjax即可:
$.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调用,而不是所有XMLHttpRequests。如果您想要这样做,那么请遵循@bertvh的建议并使用Sinon.js。

1
使用mockjax赞一个。我刚开始使用它,它非常适合单元测试以及屏幕开发的虚拟数据。唯一的问题是json数据文件被Chrome浏览器缓存了。清除缓存可以解决任何过期文件的问题。 - dano

5

我刚开始使用Sinon.JS,它可以模拟XMLHttpRequests并提供一个简单的虚假服务器API。非常易于使用!它还可以与QUnit集成。


5

1

失效链接,供您参考。 - BingLi224

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接