2012-05-11 42 views
37

Miejmy nadzieję, proste pytanie dotyczące testowania jednostki AngularJS. Mam kontroler przy użyciu prostej usługi (na podstawie projektu kątowe-nasiennej)Testy jednostek sterujących AngularJS - usługi iniekcyjne

services.js:

angular.module('myApp.services', []).value('version', '0.1'); 

controllers.js:

function MyCtrl1($s, version) { 
    $s.version = version; 
} 
MyCtrl1.$inject = ["$scope","version"]; 

Działa to doskonale im moja aplikacja. Mam jednak problem z utworzeniem kontrolera w pracy z ramkami testów jednostkowych. Nie mogę wymyślić, jak wprowadzić "wersję" usługi (lub utworzyć instancję) i przekazać ją do fabryki $ controller() - zakładam, że to właśnie chcę zrobić ?! Oto gołe kości Spec:

controllerSpec.js:

beforeEach(inject(function($rootScope, $controller) { 
    scope = $rootScope.$new(); 
    // how about version service? 
    ctrl = $controller(MyCtrl1, {$scope: scope, /* version: <where from?> */}); 
})); 

it('Version should be 0.1 ...', function() { 
    expect(scope.version).toBe('0.1'); 
}); 

przebiegu plony jarzmo testowe: > test.sh

... nie powiodło się (3,00 ms): Błąd: Błąd: Nieznany dostawca: wersjaProvider < - wersja Błąd: Nieznany dostawca: wersjaProvider < - wersja

Próbowałem różnych rzeczy z $ injector/$ provider i module(), ale bez skutku. Jestem pewien, że odpowiedź jest prosta, ale nie widzę tego.

Odpowiedz

57

po prostu dodaj beforeEach(module('myApp.services')) do swojego bloku opisu. Spowoduje to załadowanie modułu usług usługą "wersja" do wtryskiwacza testowego, który udostępni go do testu.

+0

Dziękujemy! To było proste. Nie przyszło mi do głowy, że mam dwa wywołania beforeEach() - interesujące. – iceberg

+30

góra lodowa, proszę oznaczyć ją jako zaakceptowaną odpowiedź, jeśli rozwiązała problem. –

+1

Przy okazji, czy dobrą praktyką jest pisanie testów jednostkowych dla kontrolera z zależnością usługi? Lub lepiej jest stworzyć próbę dla usługi, a następnie napisać jeden test dla kontrolera i jeden dla usługi? –

Powiązane problemy