2015-04-18 9 views
6

Ho moduli angolari:Jasmine/AngularJS: servizio dipendente da iniettare per eseguire il test dell'unità?

var app = angular.module("SearchUI",[]); 

in esso, ho un servizio "configService", che mantiene il mazzo di configurazione params:

app.provider("configService",function(){ 
    //stuff here 
}) 

Ho eseguito il test di unità gelsomino in configService Finel

describe('configService',function(){ 

var configService,$httpBackend; 


    beforeEach(module('SearchUI')); 
    beforeEach(inject(function(_configService_,$injector){ 
     configService = _configService_;  
     $httpBackend = $injector.get("$httpBackend"); 

    })); 

    it('should have default values for configService', function(){ 
     expect(configService.getDefaultSearch()).toEqual(['abstract','title','keyword','keywordplus' 
    ]); 
    }); 

//other stuff 

tutti i test passano bene.

tuttavia, non sto capendo come mantenere che l'iniezione in un altro servizio:

cioè nella mia domanda:

app.service("SearchService",function($http,$log,configService,$q){ 
    //stuff 
    search_params = configService.getDefaultSearch(); 

}) 

mia spec:

describe('SearchService',function(){ 
    var searchService,configService; 

    beforeEach(module('SearchUI')); 
    beforeEach(inject(function(_configService_,_SearchService_){ 
     configService = _configService_;  
     searchService = _SearchService_; 

    })); 


    it('SearchService should return results', function(){ 
     var waiting = searchService.SimpleSearch("card","wos",0); 


//other stuff 

le specifiche fallisce perché nel la funzione simplesearch richiede questo:

search_params = configService.getDefaultSearch(); //get the default search parameters  

la mia domanda è, come faccio ad iniettare il servizio richiesto nel servizio ANOTHER?

+0

sei sicuro che questo è il motivo per cui le tue specifiche non funzionano? A meno che non sia necessario prendere in giro il configService per cambiarne i valori, il SearchService dovrebbe averlo iniettato senza toccare il configService nei test. – lecstor

+0

sì, fallisce con un errore che indica che il servizio di configurazione non è stato avviato – nate

+0

Pubblica l'errore esatto che ottieni. –

risposta

3

I servizi sono semplicemente classi JavaScript e puoi creare un'istanza di esse senza utilizzare il meccanismo di iniezione di angular per facilitare l'iniezione della dipendenza. Invece puoi semplicemente creare una nuova istanza della classe mentre fornisci i parametri richiesti.

Attualmente si sta creando il vostro servizio tramite una funzione inline:

app.service("SearchService",function($http,$log,configService,$q){...

Invece di che, facendo un piccolo aggiustamento che separerà la dichiarazione del servizio dalla sua iniezione nel modulo angolare. Ciò consentirà di accedere dal test alla classe di servizio.

function SearchService($http, configService){... 

app.service("SearchService", SearchService); 

Dal test che si SUITE è possibile preparare i iniettabili nel beforeeach preprocessore:

describe('configService',function(){ 

    var configService, httpBackend; 
    beforeEach(module('SearchUI')); 
    beforeEach(inject(function($httpBackend){ 
     httpBackend = "$httpBackend"; 
     configService = jasmine.createSpyObj('configService', ['getDefaultSearch']); 
    })); 

    /* helper method that I create to only have one place where the service is created 
    If I add a new param/dependency then I only have to change the construction once */ 
    function createService(){ 
     return new SearchService(httpBackend, configService); 
    } 
}); 

La ragione principale di questo approccio ai test (controllo della iniezione di dipendenza manualmente piuttosto che basarsi sulla realizzazione di angolare) deve avere il pieno controllo e isolare veramente l'oggetto che sto provando a testare.

1

configService e SearchService sono init nell'app del modulo ma non nel modulo SearchUI. Sostituisci "beforeEach (module ('SearchUI'));" di "beforeEach (module ('myapp'));"

+0

, si trovano nello stesso modulo in codice reale. – nate

Problemi correlati