2014-04-08 8 views
10

Lavoro su una grande app Angolare e inizialmente abbiamo fatto molti test usando $ fornire servizi di simulazione. Tuttavia ora abbiamo un sacco di Jasmine Spies nei nostri test al fine di bloccare e spiare i servizi.

cioè

spyOn(myService, 'myMethod').andReturn 'myValue' 

Dovremmo davvero essere utilizzando $ prevedono questo o ci sono casi in cui spiare un servizio è l'approccio migliore?

Nei test angolari utilizzano spie per spying on Jquery che vedrei come servizio esterno.

spyOn(jq.prototype, 'on'); 

$provide sembra essere utilizzato di più per i servizi interni.

module(function($provide){ 
    $provide.provider('$exceptionHandler', $ExceptionHandlerProvider); 
    }); 

C'è anche una funzione di Jasmine createSpy ma ora sto pensando che forniscono $ dovrebbe sempre avere la precedenza su quella.

Qualsiasi intuizione o aiuto in questo sarebbe apprezzato.

risposta

8

Dalla mia esperienza (limitata), direi fare quello approccio rende:

  • Il codice di test più semplice/più chiaro/più breve
  • limita le ipotesi su ciò che il codice il test fa internamente.
  • Riduce i suoi effetti collaterali (come l'esecuzione delle richieste Ajax effettive)
  • Mantiene il test il più breve possibile, in termini o tempo di esecuzione.

Solitamente l'approccio spyOn funziona quando, per fare quanto sopra, vorrei stubare un singolo metodo da un servizio/fabbrica. Se ho bisogno di prendere in giro un intero servizio/fabbrica, quindi utilizzare $provide.

alcuni casi specifici vengono in mente che richiedono uno o l'altro:

  • Se si sta testando un servizio, poi a stub altri metodi di tale servizio, dovrete usare spyOn

  • Per garantire che le dipendenze supplementari non vengano introdotte più avanti nel codice in prova, rispetto a $provide si aggiunge un po 'più di protezione. Supponiamo, se si desidera garantire che da ServiceB, sia necessario ServiceA, quindi $provide, penso che sarebbe la strada da percorrere, come se ServiceA inviti qualsiasi metodo non definito da ServiceB durante il test, si verifichino errori.

    $provide.provider('ServiceB', { 
        myMethod: function() {} 
    }); 
    
  • Se si vuole prendere in giro una fabbrica che restituisce una funzione, in modo da:

    app.factory('myFactory', function() { 
        return function(option) { 
        // Do something here 
        } 
    }); 
    

    che viene utilizzato come:

    myFactory(option); 
    

    Poi, per verificare che un certo codice chiama myFactory(option) I penso che non ci sia alternativa quindi a usare $provide per deridere la fabbrica.

A proposito, non sono opzioni che si escludono a vicenda. È possibile utilizzare $provide e quindi avere ancora spie coinvolte. Nell'esempio precedente, se si desidera verificare la fabbrica è stato chiamato con un'opzione, potrebbe essere necessario:

var myFactorySpy = jasmine.createSpy(); 
$provide.provider('myFactory', myFactorySpy); 

E poi nel test al momento opportuno:

expect(myFactorySpy).toHaveBeenCalledWith(option); 
+1

Questo è utile proveniente da un altro angolo grazie. Per quanto riguarda il mocking di una factory che restituisce una funzione, penso che si possa farlo anche usando createSpy per restituire la funzione. – Asta

Problemi correlati