2015-03-03 51 views
2

我一直在單元測試掙扎了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); 
}); 

測試結果中,我得到:

預計: 「成功」

結果:未定義

+1

你'login'函數不返回任何東西。所以'result'總是未定義的。你在'login'函數中執行的所有操作都是調用'$ .getJSON',但是你沒有返回任何結果。在成功回調的內部,你試圖返回一些結果,但顯然這並沒有太多,因爲沒有人閱讀這個結果。 – 2015-03-03 08:26:03

+0

可能重複的[如何從異步調用返回響應?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call) – 2015-03-03 08:28:32

回答

1

你的login函數應該是異步的,因爲它的結果取決於來自服務器的響應。

因此,讓我們重新編寫這樣的功能:

function login(user, pass, done) { 
    $.getJSON(..., function (res) { 
     done(res.status == 'success') 
    }) 
} 

然後可以測試這樣的(假設摩卡):

describe('...', function() { 
    it('login()', function (done) { 
     login('user', 'pw', function (isLoggedIn) { 
      assert(isLoggedIn) 
      done() 
     }) 
    }) 
}) 
+0

Hi @綾!感謝您的快速回復。 我沒有得到這個電話是如何工作的 done(res.status =='success') 然後在test.js上,什麼是LoggedIn? 對不起,但我不明白如何測試qunit:/ – 2015-03-03 09:38:37

+1

我自己意識到了,再次感謝您的幫助。 – 2015-03-03 09:57:48

0

重寫我的登錄功能後作爲@ayanami建議代碼工作順利它看起來像這樣:

login.js

var login = function(form, cb){ 
    $.getJSON("loginURL", {"user":user, "pass":pass}, function(response){ 
     if(response.status === "success"){ 
      //do something 
     } 
     else{ 
      //do something else 
     } 
     cb(response.status); 
    }); 
}; 

test.js(qunit)

test("Testing login", function(assert) { 
    var done = assert.async(); 
    var cb = function(param){ 
       assert.equal(param,"success", "Expect getJSON/login to success"); 
       done(); 
      }; 
    login(user, pass,cb); 
}); 
相關問題