我正在尝试使用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的setup / teardown来做到这一点?
答案 0 :(得分:3)
在创建另一个模拟处理程序之前,您似乎需要调用$.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()
行。
更灵活的解决方案:
<your handlerID variable>
)中的设置复制到此备份。在模块的拆解中,使用$ .mockjaxClear(<your handlerID variable>
)删除模块,然后将<your handlerID variable>
设置为其他内容。setup
和各个测试功能中覆盖处理程序。但是不要相信我的话。 Check out the fiddle
这样的灵活性要高得多。您可以更改一个处理程序并保留所有其他处理程序。
它似乎确实容易出错,所以我建议小心。