2015-04-18 12 views
6

mam kątowych moduły:Jasmine/AngularJS: Inject usługa zależna od usługi w teście jednostkowym?

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

w nim, mam usługę "configService", który utrzymuje kilka config params:

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

Mam prowadził testy jednostkowe jaśmin w 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 

wszystkie testy przechodzą pomyślnie.

jednak ja nie rozumiejąc, jak utrzymać ten zastrzyk w innej usługi:

czyli w mojej aplikacji:

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

}) 

moja specyfikacja:

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 

spec powiodło się, ponieważ w Funkcja wyszukiwania uproszczonego wymaga:

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

moje pytanie brzmi: w jaki sposób mogę wprowadzić wymaganą usługę do usługi ANOTHER?

+0

Czy jesteś pewien, że właśnie dlatego Twoja specyfikacja zawodzi? O ile nie musisz kpić z configService, aby zmienić jego wartości, usługa SearchService powinna je wprowadzić bez dotykania configService w twoich testach. – lecstor

+0

Tak, nie powiedzie się z błędem wskazującym, że usługa konfiguracji nie została uruchomiona. – nate

+0

Wpisz dokładny błąd, jaki otrzymasz. –

Odpowiedz

3

Usługi są po prostu klasami JavaScript i można utworzyć ich instancję bez użycia mechanizmu wprowadzania kątowego w celu ułatwienia wstrzyknięcia zależności. Zamiast tego możesz po prostu utworzyć nową instancję klasy, jednocześnie dostarczając wymagane parametry.

Obecnie tworzysz swoje usługi za pośrednictwem funkcji inline:

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

Zamiast tego, dokonując niewielkiej korekty, która będzie oddzielać się deklarację usługi od jej wstrzyknięciu do modułu kątowego. Dzięki temu uzyskasz dostęp z testu do klasy usług.

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

app.service("SearchService", SearchService); 

ze swojego testu ty swoich można przygotowywać zastrzyki w beforeEach preprocesora:

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

Głównym powodem stosowania tego podejścia do testowania (sterowanie iniekcji zależność ręcznie zamiast polegać na realizacji kątowej za) to mieć pełną kontrolę i naprawdę odizolować przedmiot, który próbuję przetestować.

1

configService i SearchService są init w module app, ale nie w module SearchUI. Zastąp "beforeEach (module (" SearchUI "));" przez "beforeEach (module ('myapp'));"

+0

mój błąd, są one w tym samym module w prawdziwym kodzie. – nate

Powiązane problemy