gpt4 book ai didi

jquery - 异步 QUnit + Mockjax 测试中相同调用的多个响应

转载 作者:行者123 更新时间:2023-12-01 00:19:27 26 4
gpt4 key购买 nike

我正在尝试使用 QUnit 和 Mockjax 测试一些 jQuery ajax 代码,并让它为不同的测试返回不同的 JSON,like this :

$(document).ready(function() {

function functionToTest() {
return $.getJSON('/echo/json/', {
json: JSON.stringify({
"won't": "run"
})
});
}

module("first");

test("first test", function() {

stop();

$.mockjax({
url: '/echo/json/',
responseText: JSON.stringify({
hello: 'HEYO!'
})
});

functionToTest().done(function(json) {
ok(true, json.hello);
start();
});
});


test("second test", function() {

stop();

$.mockjax({
url: '/echo/json/',
responseText: JSON.stringify({
hello: 'HELL NO!'
})
});


functionToTest().done(function(json) {
ok(true, json.hello);
start();
});


});

});

不幸的是,它为每个调用返回相同的响应,并且无法保证顺序,因此我想知道如何设置它,以便它与实际请求耦合并出现 with this :

$.mockjax({
url: '/echo/json/',
response: function(settings) {

if (JSON.parse(settings.data.json).order === 1) {
this.responseText = JSON.stringify({
hello: 'HEYO!'
});
} else {
this.responseText = JSON.stringify({
hello: 'HELL NO!'
});
}
}
});

这依赖于发送到服务器的参数,但是没有参数的请求又如何,我仍然需要测试不同的响应?有没有办法使用 QUnit 的安装/拆卸来做到这一点?

最佳答案

看来您需要调用$.mockjaxClear();在创建另一个模拟处理程序之前。

Mockjax 通过更改 $.ajax 方法来工作。

its source code 的底部我们可以看到您正在使用的 $.mockjax 方法是其公开的方法之一,只是将更多处理程序附加到mockHandlers 数组中。

    $.mockjax = function(settings) {
var i = mockHandlers.length;
mockHandlers[i] = settings;
return i;
};

在$.ajax替换的源代码中,我们可以看到:

    // Iterate over our mock handlers (in registration order) until we find
// one that is willing to intercept the request
for(var k = 0; k < mockHandlers.length; k++) {

您的问题是由于 $.ajax 方法满足 /echo/json/ 数组中的第一个处理程序(因此不是最新的)模拟处理程序网址。

这里是my fork of your fiddle ,只需添加 $.mockjaxClear()线。

<小时/>

编辑:

更灵活的解决方案:

  • 在任何测试函数之外,声明一个变量,该变量将具有请求处理程序的 ID,以供以后更改。
  • 在需要重写某个处理程序的模块之前,声明一个变量(不需要初始值)来保存要修改的处理程序的备份。
  • 然后在模块设置函数中使用 $.extend 将设置从 $.mockjax.handler( <your handlerID variable> ) 复制到此备份。在模块的teardown中,使用 $.mockjaxClear( <your handlerID variable> ) 删除模块,然后设置 <your handlerID variable>到别的事情上。
  • 现在您可以覆盖模块 setup 中的处理程序以及各个测试功能。

但不要相信我的话。 Check out the fiddle .

这样就灵活多了。您可以更改该一个处理程序,并保留您可能拥有的所有其他处理程序。

它似乎确实容易出错,所以我建议要小心。

关于jquery - 异步 QUnit + Mockjax 测试中相同调用的多个响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12165651/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com