我一直在單元測試掙扎了2天,並且有些東西我無法實現異步測試。我是新來的單元測試,我不明白爲什麼這不起作用。如何單元測試調用getJSON的javascript函數
我有一個文件login.js,它調用$ .getJSON(url,data,function)並返回一個字符串,其狀態爲login(「success」或「fail」)。 對$ .getJSON的調用使用mockjax來獲取數據(它包裝一個ajax調用)。
當使用jQuery click事件從測試網頁調用登錄函數時可以正常工作。 但現在我試圖運行使用Qunit和PhantomJS的無頭測試。
看來問題在於測試並未等待$ .getJSON調用來獲取結果(即使在使用超時時)。 任何線索? 這是代碼。
login.js
var login = function(user, pass){
$.getJSON("loginURL", {"user":user, "pass":pass}, function(response){
if(response.status === "success"){
//do something
return "success";
}
else{
//do something else
return "fail";
}
});
};
test.js
test("Test login", function(){
var user = "user1", pass = "pass1";
var done = assert.async();
var result = login(user, pass);
setTimeout(function(){
assert.equal(result, "success", "expect login succeded");
done();
},1000);
});
測試結果中,我得到:
預計: 「成功」
結果:未定義
你'login'函數不返回任何東西。所以'result'總是未定義的。你在'login'函數中執行的所有操作都是調用'$ .getJSON',但是你沒有返回任何結果。在成功回調的內部,你試圖返回一些結果,但顯然這並沒有太多,因爲沒有人閱讀這個結果。 – 2015-03-03 08:26:03
可能重複的[如何從異步調用返回響應?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call) – 2015-03-03 08:28:32