2015-02-09 11 views
7

Sto cercando di implementare un test di gelsomino su una semplice implementazione promessa (codice asincrono) con la funzione di fatto() e il mio test non riesce, anche se il codice in fase di sperimentazione opere perfettamente bene. Qualcuno può aiutarmi a capire cosa manca nel mio test?testare la funzionalità asincrona in Jasmine 2.0.0 con DONE()

var Test = (function() { 
    function Test(fn) { 
     this.tool = null; 
     fn(this.resolve.bind(this)); 
    } 
    Test.prototype.then = function (cb) { 
     this.callback = cb; 
    }; 
    Test.prototype.resolve = function (value) { 
     var me = this; 
     setTimeout(function() { 
      me.callback(value); 
     }, 5000); 
    }; 
    return Test; 
})(); 

describe("setTimeout", function() { 

    var test, newValue = false, 
     originalTimeout; 
    beforeEach(function (done) { 
     originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; 
     jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; 

     test = new Test(function (cb) { 
      setTimeout(function() { 
       cb(); 
      }, 5000); 
     }); 
     test.then(function() { 
      newValue = true; 
      console.log(1, newValue); 
      done(); 
     }); 
    }); 

    it("Should be true", function (done) { 
     expect(1).toBe(1); 

     expect(newValue).toBeTruthy(); 
    }); 

    afterEach(function() { 
     jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; 
    }); 
}); 

la stessa prova in jsfiddle: http://jsfiddle.net/ravitb/zsachqpg/

risposta

7

Questo codice sta testando una semplice promessa come oggetto, quindi chiamerà l'oggetto Test una promessa per convenienza.

ci sono due diversi eventi asincroni dopo la creazione promessa: 1. La chiamata al metodo di .then() 2. La risoluzione della promessa chiamando la funzione cb() nella funzione beforeEach().

Nel mondo reale questi due possono essere chiamati in qualsiasi ordine e in qualsiasi momento.

Per la prova, la chiamata .then() deve essere spostato callback della sezione it() e tutti i metodi di specifica (per esempio expect()) devono essere chiamato nella sua richiamata o che sarà eseguito prima che sia risolto. Il beforeEach() fa parte della configurazione di prova mentre la funzione it() è la specifica, il test stesso.

Procedimento done() deve essere chiamato due volte,

  1. Quando è terminata l'azione beforeEach() asincrona (cioè dopo la cb() si chiama), che inizia l'esecuzione spec. Così dovrebbe essere simile a questa:

    beforeEach(function (done) { 
        test = new Test(function (cb) { 
         setTimeout(function() { 
          console.log("in beforeEach() | setTimeout()"); 
          cb(resolvedValue); 
          done() 
         }, 500); 
        }); 
        }); 
    
  2. Quando l'azione asincrona (it() della sezione) della specifica è finito all'interno del metodo .then() dopo tutte le chiamate a metodi di prova di gelsomino, questo vi dirà Jasmine spec terminato l'esecuzione (e quindi il time-out non sarà raggiunto). Quindi:

    it("Should be " + resolvedValue, function (done) { 
        test.then(function (value) { 
         console.log("in then()"); 
         expect(value).toBe(resolvedValue); 
         done(); 
        });  
    }); 
    

Inoltre, come si può vedere in luogo dei test che il valore di una variabile è cambiato sto testando che il valore passato al metodo .then() è lo stesso di quello passato per la determinazione promessa cb() perché questo è il comportamento giusto che ci si aspetta.

Ecco uno updated version del tuo violino.

È possibile controllare nella console del browser di vedere che tutte le richiamate vengono chiamati

Nota: La modifica DEFAULT_TIMEOUT_INTERVAL di Jasmine solo rende più complicata per nessun motivo, così ho tolto e qualche codice estraneo.

+1

Inoltre, se * si * è necessario modificare l'intervallo di timeout su una base per test, è sufficiente passare l'intervallo personalizzato come terzo parametro a 'it()' (cioè dopo la funzione: 'it (desc , function (done) {...}, 10000); '.) – Kev

+0

@Lior Si prega di aiutare questo: https://stackoverflow.com/questions/45311260/how-to-test-an-asynchronous-function-using- karma-gelsomino-in-ionic2 – Aditya

Problemi correlati