我正在使用jQuery $ .when来处理ajax回调,而我正在使用mockjax来模拟我的单元测试中的各种响应。其中一个响应返回500的状态错误。我的失败回调引发错误,在Q-Unit中我试图使用“加注”来捕获该错误,但我得到的只是实际错误。
以下是代码:
var bar = new Object();
// ajax call, returns a promise object
bar.ajaxCall = function () {
return $.ajax({
url: "foo/foo"
, dataType: "json"
, data: { "blah": "blee" }
});
}
// function I'm testing ...
bar.handleAjax = function () {
return $.when(ajaxCall.call(this))
.done(function(data) { /* Success callback */ })
.fail( throw "Error!!"; });
}
单元测试:
// Mock ajax call in the unit test
var mock = $.mockjax({
url: "foo/foo"
, contentType: "json"
, status: 500
});
// unit test for "load"
loadTest = function () {
test("testing load failure", function () {
stop(); // stop the test so QUnit knows to wait for the ajax response
raises(function () {
var promise = bar.handleAjax();
}, "We expect an error to be thrown");
setTimeout(function() {
start();
}, 500);
});
}
如何重写测试以确保handleAjax在适当的时候抛出错误?
答案 0 :(得分:1)
问题是在handleAjax()
内调用raises()
会立即返回,并且错误将被抛出此函数之外。
要解决此问题,您可以使ajax调用同步,这样错误就会被抛入raises()
。
raises(function () {
$.ajaxSetup({ async: false });
bar.handleAjax();
}, "We expect an error to be thrown");
HERE 是工作代码。
您的问题是您在fail()
内抛出错误,并且您无法轻易控制何时调用此失败回调并且除非您同步执行它,否则将抛出异常。您可以重写您的代码,而不是抛出错误,您将调用回调。
bar.handleAjax = function(success, error) {
return $.when(this.ajaxCall.call(this))
.done(function() { success && success.call(this); })
.fail(function() { error && error.call(this); });
};
HERE 就是一个例子。
期待更好的想法:)。