2013-03-09 24 views
0

我想爲我的挖空視圖模型編寫一些qunit單元測試,並且遇到了一個有趣的問題。

以我視圖模型我有以下功能:

Get = function (id) { 
     return $.ajax({ 
      url: API + "/" + id, 
      type: 'GET', 
      dataType: 'json', 
      timeout: Timeout, 
      statusCode: { 
       200: GetOneSuccess, 
       404: ItemNotFound 
      }, 
      error: function() { 
       //Item(null); 
      } 
     }); 
    }, 
在我的單元測試

然後,我有這樣的:

vm.Get(vm.Item().Id()).then(function() {      
    ok(false, "Failure!"); 
},function() { 
    equal(vm.Item(), null, "Item was removed"); 
    start(); 
}); 

ItemNotFound如下:

ItemNotFound = function() { 
     Item(null); 
    } 

這非常簡單,如果API控制器返回「NotFound(Error 404)」,則將Item設置爲null。我發現我的測試如果失敗,因爲當「then」被稱爲ItemNotFound函數尚未完成。

如果我添加一個超時我的單元測試,它的工作原理:

  vm.Get(vm.Item().Id()).then(function() {      
        ok(false, "Failure!"); 
      },function() { 
        setTimeout(function() { 
         equal(vm.Item(), null, "Item was removed"); 
         start(); 
        }, 2000); 
      }); 

任何人有什麼想法?我應該只是不打擾statusCodes,只處理錯誤處理程序中的所有錯誤類型?看起來不那麼優雅。

回答

0

錯誤處理程序在狀態代碼函數被觸發之前被觸發。 「then」函數採用「成功回調」和「錯誤回調」。所以本質上,你的錯誤(失敗)在狀態碼「notfound」觸發之前觸發。

設置超時時,函數立即返回,觸發狀態碼,然後根據設置的超時值觸發特定的代碼。

如果你仍然想要的代碼結構,那麼這裏是我會怎麼做。您的GET函數應返回一個Deffered promise對象,它封裝了實際的ajax調用,並且不指定成功或錯誤處理程序,並首先從statusCode調用成功或錯誤函數。

我創建了一個搗鼓相同

http://jsfiddle.net/sujesharukil/BWA9D/15/

var data = { 
    json: $.toJSON({ 
     text: 'some text', 
     array: [1, 2, 'three'], 
     object: { 
      par1: 'another text', 
      par2: [3, 2, 'one'], 
      par3: {} 
     } 
    }) 
} 


var callEcho = function(url) { 
    return $.Deferred(function(def){ 
     $.ajax({ 
     url: url, 
     type: "POST", 
     data: data, 
     statusCode: { 
      200: function(data,xhr){ 
       GetOneSuccess(); 
       def.resolve(data); 
      }, 
      404: function(xhr){ 
       ItemNotFound(); 
       def.reject(); 
      } 
     } 
    });  
}).promise(); 

}; 

function GetOneSuccess(){ 
    alert('Get One success Called'); 
} 

function ItemNotFound(){ 
    alert('Item Not Found Called'); 
} 

var testFunc = function(url){ 
    var js = callEcho(url); 
    js.done(function(data){ 
     alert(JSON.stringify(data) + ' done function called'); 
    }); 

    js.fail(function(){ 
     alert('fail function called.'); 
    }); 
} 

//fire the success 
testFunc("/echo/json/"); 

//fire the fail 
testFunc("/echo/jso/"); 
相關問題