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?
Sind Sie sicher, dass alle Dateien geladen sind und in der richtigen Reihenfolge geladen werden? – Jmr
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. –