我有两个问题:
您可以在 qunit 中进行参数化单元测试吗?
您如何使用 qunit 进行模拟,例如模拟getJSON
呼叫?
谢谢
对于模拟 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 函数的值 - 调用成功回调并断言它做了它应该做的事情
除了重写 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。
我刚开始使用Sinon.JS,它允许模拟 XMLHttpRequests 并且还提供了一个简单的假服务器 API。真的很容易使用!它还提供与 qunit 的集成。
我的插件实现允许参数化 qunit 测试: https ://github.com/AStepaniuk/qunit-parameterize
请参阅此链接以在您的 setup/teardown 方法中模拟 getJSON 调用, http: //www.ajaxprojects.com/ajax/tutorialdetails.php?itemid=505