2013-05-18 14 views
13

Kämpfen um Einheitstests eingerichtet in Jasmine/Karma. Ich habe einen Controller mit einer Dienstabhängigkeit, und dieser Dienst hat eine andere Dienstabhängigkeit. Ich organisiere meine Module nicht nach Typ (Direktiven, Services, etc.), sondern nach Features (Layout, summaryView, etc).Testen modularer AngularJS w/Jasmine & Karma

Hier ist die Architektur:

angular.module('myApp', ['ngResource', 'myApp.base', 'myApp.layout','myApp.common']); 
angular.module('myApp.base', ['myApp.common']); 
angular.module('myApp.common',[]); 
angular.module('myApp.layout',['myApp.common']); 

Controller:

angular.module('myApp.layout') 
    .controller('LayoutCtrl', ['$scope', '$rootScope', '$timeout', 'layoutService', 'urlService', 'BaseService', 
     function ($scope, $rootScope, $timeout, layoutService, urlService, BaseService) { 
      //controller code here 
    }); 

Layout Service:

angular.module('myApp.layout') 
    .service('layoutService', ['$http', '$resource', '$rootScope', '$location', '$route', 'errorHandlingService', 'utilService', 
     function ($http, $resource, $rootScope, $location, $route, errorHandlingService, utilService) { 
      //service code here 
    }); 

Von dem, was ich verstehe, wenn ich einfach beforeEach(module('myApp.layout')); sind, sollte ich Zugang zu meine Controller, Dienste, Filter und Direktiven in meinem Layout-Modul.

Stattdessen wird der folgende Code fehlschlägt:

describe('Layout Controller', function() { 
    var ctrl, scope, service; 

    beforeEach(module('myApp')); 
    beforeEach(module('myApp.layout')); 
    beforeEach(inject(function($controller, $rootScope, layoutService) { 

     scope = $rootScope.$new(); 
     service = layoutService; 
     //Create the controller with the new scope 
     ctrl = $controller('LayoutCtrl', {$scope: scope, layoutService: service}); 
     dump(scope); 
    })); 
    it('should exist', function() { 
     expect(ctrl).toBeDefined(); 
    }); 
}); 

Mit diesem Fehler:

Chrome 26.0 (Mac) Layout Controller should exist FAILED 
    Error: Unknown provider: layoutServiceProvider <- layoutService 
     at Error (<anonymous>) 
     at http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js:28:236 
     at Object.c [as get] (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js:26:13) 
     at http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js:28:317 
     at c (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js:26:13) 
     at Object.d [as invoke] (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js:26:147) 
     at workFn (http://code.angularjs.org/1.0.4/angular-mocks.js:1754:20) 
    Error: Declaration Location 
     at window.jasmine.window.inject.angular.mock.inject (http://code.angularjs.org/1.0.4/angular-mocks.js:1740:25) 
     at null.<anonymous> (/Users/scottsilvi/svn/BARO/web/src/test/js/unit/myApp.layoutModule.js:6:14) 
     at /Users/scottsilvi/svn/BARO/web/src/test/js/unit/myApp.layoutModule.js:1:1 
    Expected undefined to be defined. 
    Error: Expected undefined to be defined. 
     at null.<anonymous> (/Users/scottsilvi/svn/BARO/web/src/test/js/unit/myApp.layoutModule.js:15:16) 
Chrome 26.0 (Mac): Executed 10 of 10 (1 FAILED) (0.36 secs/0.014 secs) 

Gedanken?

+2

Sind Sie sicher, dass alle Dateien geladen sind und in der richtigen Reihenfolge geladen werden? – Jmr

+0

Ja, das war das Problem. Einige der Abhängigkeiten im myApp-Modul wurden nicht geladen. Sobald ich alle geladen hatte, begannen die Tests zu arbeiten. Gehen Sie weiter und legen Sie eine Antwort und ich werde als richtig markieren. Danke. –

Antwort

10

Oft kommt ein unbekannter Provider-Fehler von Dateien, die nicht geladen werden oder in der falschen Reihenfolge geladen werden. Überprüfen Sie, welche Dateien vorhanden sind, während Ihre Tests ausgeführt werden.

+3

Nur um hinzuzufügen, ich vermisste ein 's' in meinem Dienst. ughh ... –

+4

@Jmr Wie erkennen Sie, welche Dateien vorhanden sind, wenn Tests ausgeführt werden? –

+0

@GeorgeStocker Führen Sie Karma mit logLevel DEBUG – Jay

0

Diese Art von Fehlern tritt meist aufgrund einer falschen Deklaration von Dateien innerhalb karma.config.js Datei. Für die Einrichtung von Karma-Jasmin alle Dateien innerhalb file:[] Block Karma.config.js Datei sollte in der Reihenfolge, in der sie erwartet werden, geladen werden. Das Hauptmodul wird mit der Abhängigkeitsinjektion eines beliebigen benutzerdefinierten Dienstes belastet und lädt dann zuerst diesen Dienst und dann das Hauptmodul.

Verwandte Themen