2013-06-05 2 views
12

Ho cercato dappertutto e sembra che questo errore sia dovuto a non usare correttamente asyncTest. Tuttavia, secondo la documentazione, sembra che lo sto facendo correttamente. Immagino che mi manchi un piccolo dettaglio da qualche parte e ho bisogno di un paio di occhi in più ...Errore Qunit: asserzione al di fuori del contesto di test

Sto provando a testare del codice che fa una richiesta ajax per ottenere una pagina e poi la carica in una lightbox . lightbox-content non viene visualizzato nel DOM fino a quando la chiamata ajax non è stata completata e può essere visualizzata. Quindi, posso solo verificarlo nella mia chiamata onComplete, che è dove ho il mio test per vedere se è stato caricato correttamente.

Ecco il mio codice:

asyncTest('mytest', 1, function() { 
    utils.lightbox.show('/login', { 
     onComplete: function() { 
      ok($('#lighbox-content').is(':visible'), 'Lightbox loaded the /login page.'); 
      start(); 
     } 
    }); 
}); 

ottengo l'errore:

Uncaught Error: assertion outside test context, was at HTMLDivElement.window.utils

chiunque può vedere dove sto andando male?

+1

Il 't' mancante in' lighbox-content' è un errore durante la pubblicazione della domanda? –

+0

Ho lo stesso messaggio di errore, l'errore appare all'interno di 'on ('load'' callback anziché onComplete, ma penso che sia tutto uguale sotto il cofano. Hai provato il downgrade a diverse versioni di QUnit? – Dan

risposta

7

Accetto che il codice corrisponda alla documentazione per quanto ne so.

Aggiornamento

Anche se la documentazione non vederlo, mi chiedo se si deve dire QUnit di fermarsi ad un certo punto in modo che sa attendere, dopo la funzione ritorna test. Penserei che QUnit lo assuma poiché è un test asincrono, ma vale la pena provare.

asyncTest('mytest', 1, function() { 
    stop(); 
    ... 
}); 

Ho usato Sinon.JS per evitare di effettuare le chiamate AJAX in primo luogo. Ciò ha tre vantaggi immediati:

  1. Non dipende da un server per rispondere alle richieste.
  2. Posso specificare risultati diversi per ciascun test.
  3. I test vengono eseguiti molto più velocemente.

Il mocking può essere eseguito a livello XMLHttpRequest o sul metodo jQuery ed è abbastanza semplice. Ecco un esempio di uno dei miei test:

module("geo", { 
    setup: function() { 
     this.server = sinon.fakeServer.create(); 
    }, 

    teardown: function() { 
     this.server.restore(); 
    } 
} 

test("returns detected ZIP code", function() { 
    this.server.respondWith("/geo/detect-zip-from-ip", 
          [ 200, { "Content-Type": "text/html" }, '90210' ]); 
    geo.detectZip(function (zip) { 
     assertThat(zip, is('90210')); 
    }); 
    this.server.respond(); 
}); 
+0

Grazie a David. Mi occuperò ancora del problema di Qunit. – intargc

+0

Era la cosa "stop();" per me. Grazie per avermelo ricordato :) :) – joaorodr84

+0

@intargc problema? –

0

Ho trovato una soluzione per il mio caso, spero che il tuo problema abbia la stessa fonte.

spiega in parole:

  • Ho un complicato prova asincrona
  • ho ritardato eventi, e ci sono ok e equal asserzioni all'interno
  • Naturalmente, tutto questo è avvolto all'interno asyncTest
  • Ma, quando il test è "completato" e chiamo start(), i gestori di eventi rimangono lì
  • Af ter chiamando start(), tutte le ulteriori richieste di ok all'interno che asyncTest diventare illegale
  • e gettare eccezioni
  • Mi chiedo che cosa succede se il numero in expect (nel tuo esempio è il secondo parametro) viene superato. La stessa eccezione?

Spiegando in codice:

asyncTest('mytest', /*1,*/ function() { 

      function imgLoadedOrFailed (result) { 
       clearTimeout(imageTimeToLive); 
       img.off(); 
       ok(result, 'Image in carousel pane has been loaded'); 
      } 

      var imageTimeToLive = setTimeout(
        imgLoadedOrFailed.bind(this, false), 
        5000), 
       img = panes[index].find('img:first'); 

      if (img) { 
       img.on('load', imgLoadedOrFailed.bind(this, true)); 
       img.on('error', imgLoadedOrFailed.bind(this, false)); 
      } 
     }); 


     // at some point I call: start(); 

In questo esempio, quando ho "finito" il test chiama start(), i onload e onerror eventi può ancora succedere.

Problemi correlati