2013-04-04 13 views
29

Jestem całkiem nowy w Angular i przejrzałem wszystkie podobne pytania dotyczące Stack Overflow, ale żaden nie pomógł mi. Wydaje mi się, że wszystko zostało poprawnie skonfigurowane, ale wciąż otrzymuję błąd "Nieznany dostawca" podczas próby wstrzyknięcia usługi do testu jednostkowego. Podałem mój kod poniżej - mam nadzieję, że ktoś zauważy oczywisty błąd!Wystąpił nieznany błąd dostawcy podczas wstrzykiwania usługi do testu jednostkowego Angular

zdefiniować swoje moduły w oddzielnym js plik tak:

angular.module('dashboard.services', []); 
angular.module('dashboard.controllers', []); 

Oto gdzie mogę zdefiniować usługę o nazwie EventingService (z logiką usunięte dla zwięzłość):

angular.module('dashboard.services').factory('EventingService', [function() { 
    //Service logic here 
}]); 

Oto mój kontroler, który używa usługi EventingService (wszystko działa poprawnie w czasie wykonywania):

angular.module('dashboard.controllers') 
    .controller('Browse', ['$scope', 'EventingService', function ($scope, eventing) { 
     //Controller logic here 
}]); 

Oto mój testów jednostkowych - jego linia gdzie próbować wstrzykiwać EventingService który powoduje błąd podczas uruchamiania testów jednostkowych:

describe('Browse Controller Tests.', function() { 
    beforeEach(function() { 
     module('dashboard.services'); 
     module('dashboard.controllers'); 
    }); 

    var controller, scope, eventingService; 

    beforeEach(inject(function ($controller, $rootScope, EventingService) { 
     scope = $rootScope.$new(); 
     eventingService = EventingService 

     controller = $controller('Browse', { 
      $scope: scope, 
      eventing: eventingService 
     }); 
    })); 


    it('Expect True to be True', function() { 
     expect(true).toBe(true); 
    }); 
}); 

Kiedy wykonać test I ten błąd:

Error: Unknown provider: EventingServiceProvider <- EventingService

mam zapewnione, że mój plik specrunner.html jaśmin posiada wszystkie niezbędne pliki źródłowe (to jest projekt Asp.Net MVC):

<!-- Include source files here... --> 
@Scripts.Render("~/bundles/jquery") 
<script type="text/javascript" src="@Url.Content("~/Scripts/angular.js")"></script> 
<script type="text/javascript" src="@Url.Content("~/Scripts/angular-mocks.js")"></script>     

<script type="text/javascript" src="@Url.Content("~/App/scripts/app.js")"></script>      <!-- Angular modules defined in here --> 
<script type="text/javascript" src="@Url.Content("~/App/scripts/services/eventing.js")"></script>   <!-- My Eventing service defined here --> 


<script type="text/javascript" src="@Url.Content("~/App/scripts/controllers/browse.js")"></script>  <!-- My Browse controller defined here --> 

<!-- Include spec files here... --> 
<script type="text/javascript" src="@Url.Content("~/App/tests/browse.js")"></script>      <!-- The actual unit test here --> 

Właśnie c nie wiem dlaczego Angular rzuca ten błąd narzekając na moją EventingService. Mój kontroler działa dobrze w czasie wykonywania - właśnie wtedy, gdy próbuję go przetestować, dostaję błąd, więc jestem ciekawy, czy wkręciłem coś z kpiną/zastrzykiem.

Kątowa pomoc w testowaniu to bzdura, więc na razie jestem zaskoczony - każda pomoc lub sugestie, które ktoś może podać, byłyby bardzo doceniane. Dzięki.

+0

Nowość w jednostce testowej Angulara w tej chwili, i całkowicie zgadzam się z "Pomocą Angulara w testowaniu jest bzdura, więc jestem zaskoczony w tej chwili" – Michel

Odpowiedz

6

Jeśli kontrolery (zdefiniowane w ramach modułu dashboard.controllers) zależy od pewnych usług, które są zamknięte w innym module (dashboard.services) niż trzeba odwołać moduły zależnościami w module Podpis:

angular.module('dashboard.services', []); 
angular.module('dashboard.controllers', ['dashboard.services']); 
+2

Stewie - dziękuję za odpowiedź, ale nie sądzę, że to jest problem. W mojej aplikacji działają moje zależności (moja aplikacja działa poprawnie). To czysto mój test, który rzuca ten błąd i wierzę, że załadowane wszystkie wymagane moduły do ​​mojego testu w moim „beforeEach” rachunku – Dud

0

Czy próbowałeś definiowania dodatkowy moduł, który zależy od innych modułów zagregowanych tak:

angular.module('dashboard', [ 'dashboard.services', 'dashboard.controllers' ]) 

więc można w beforeEach określić jeden moduł, który posiada zarówno submodules zdefiniowane w nim tak:

describe('Browse Controller Tests.', function() { 
    beforeEach(function() { 
     module('dashboard'); 
    }); 

    var controller, scope, eventingService; 

    beforeEach(inject(function ($controller, $rootScope, EventingService) { 
     scope = $rootScope.$new(); 
     eventingService = EventingService 

     controller = $controller('Browse', { 
      $scope: scope, 
      eventing: eventingService 
     }); 
    })); 


    it('Expect True to be True', function() { 
     expect(true).toBe(true); 
    }); 
}); 
25

po prostu wpadł na to i rozwiązać ją przełączeniem do uzyskania usługi przy użyciu $ wtryskiwacz wyraźnie:

var EventingService, $rootScope; 
beforeEach(inject(function($injector) { 
    EventingService = $injector.get('EventingService'); 
    $rootScope = $injector.get('$rootScope'); 
})); 

Chciałbym móc powiedzieć, dlaczego to działa i dlaczego prosty

beforeEach(inject(function(EventingService) { .... })); 

nie, ale nie mam czasu na zbadanie wnętrz. Zawsze najlepiej używać jednego stylu kodowania i trzymać się go.

Ten styl jest lepszy, że nazwa zmiennej używanej w badaniach jest poprawna nazwa usługi. Ale jest trochę gadatliwy.

Istnieje inna funkcja magii kątowej, która używa dziwnych nazw zmiennych, takich jak $ rootScope, ale nie podoba mi się ten hakowaty wygląd.

Należy zauważyć, że większość czasu ludzie się ten błąd, ponieważ nie obejmuje moduły:

beforeEach(module('capsuling')); 
beforeEach(module('capsuling.capsules.services')); 
+0

napisałem testowania pomocnika, którego używam cały czas teraz, że całkowicie eliminuje ten nudny boilerplate. Muszę znaleźć czas, aby wydać to wkrótce. – felix

1

Choć kwestia ta jest dość stary i stracił rozwiązując problem podobny do tego, czyli dużo czasu :

Error: Unknown provider: SomeServiceProvider <- SomeService 

Dlatego pozostawiam tutaj inną możliwą przyczynę tego problemu. Mam nadzieję, że komuś by się przydał.

W moim przypadku, miałem w moim projekcie dwa moduły z dokładnie tej samej nazwie, ale z tworzone różne zależności, czyli dwóch różnych plikach .js z:

angular.module('moduleName', [dependencies])) 

Od kątowej dokumentacji:

Passing one argument retrieves an existing angular.Module, whereas passing more than one argument creates a new angular.Module

Wniosek: Okazuje się, że to, co zostało wstrzyknięte do testu, było modułem z nieprawidłowymi zależnościami. Usunięcie drugiego argumentu w module, który został błędnie tworzony rozwiązać ten problem.

Powiązane problemy