用Q-Unit测试ajax故障

时间:2011-12-12 15:28:48

标签: jquery ajax unit-testing qunit

我正在使用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在适当的时候抛出错误?

1 个答案:

答案 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 就是一个例子。

期待更好的想法:)。