Come funziona la function test unit test che chiama getJSON

Mi sono lottato con un test di unità per 2 giorni e c'è qualcosa che non riesco a get per quanto riguarda il test asincrono. Sono nuovo alla prova di unità e non capisco perché questo non funziona.

Ho un file login.js che chiama $ .getJSON (url, dati, function) e restituisce una string con lo stato di login ("successo" o "fail"). La chiamata a $ .getJSON utilizza mockjax per get i dati (avvolge una chiamata ajax).

La function di accesso funziona correttamente, quando viene chiamata da una pagina web di prova utilizzando l'evento jQuery click. Ma ora sto cercando di eseguire test senza testa con Qunit e PhantomJS.

Sembra che il problema è che il test non aspetta la chiamata $ .getJSON per get il risultato (anche quando si utilizza un timeout). Qualsiasi indizio? Ecco il codice.

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); }); 

Nel risultato del test ho:

Previsto: "successo"

Risultato: non definito

La tua function di login dovrebbe essere asynchronous, perché il suo risultato dipende da una risposta dal server.

Ricordiamo così la function:

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

Allora puoi testare come questo (assumendo moka):

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

Dopo aver riscritto la mia function di login come @ayanami ha suggerito che il codice funziona senza problemi e sembra così:

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); });