Тестирование модульного AngularJS с Jasmine и Karma

Пытаюсь настроить модульное тестирование в Jasmine/Karma. У меня есть контроллер с сервисной зависимостью, и у этой службы есть другая сервисная зависимость. Я организую свои модули не по типу (директивы, службы и т. д.), а по функциям (макет, сводка и т. д.).

Вот архитектура:

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']);

Контроллер:

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

Служба верстки:

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

Насколько я понимаю, если я просто включу beforeEach(module('myApp.layout'));, у меня должен быть доступ к моим контроллерам, службам, фильтрам и директивам в моем модуле макета.

Вместо этого следующий код не работает:

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

С этой ошибкой:

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)

Мысли?


person Scott Silvi    schedule 18.05.2013    source источник
comment
Вы уверены, что все файлы загружаются и загружаются в правильном порядке?   -  person Jmr    schedule 21.05.2013
comment
да дело оказалось в этом. Некоторые зависимости в модуле myApp не загружались. Как только я загрузил их все, тесты начали работать. Давай, напиши ответ, и я отмечу его как правильный. Спасибо.   -  person Scott Silvi    schedule 21.05.2013


Ответы (2)


Часто ошибка неизвестного поставщика возникает из-за того, что файлы не загружаются или загружаются в неправильном порядке. Проверьте, какие файлы присутствуют во время выполнения ваших тестов.

person Jmr    schedule 20.05.2013
comment
@Jmr, как определить, какие файлы присутствуют во время выполнения тестов? - person George Stocker; 14.05.2015
comment
@GeorgeStocker Управляйте кармой с помощью logLevel DEBUG - person Jay; 16.04.2016

Подобные ошибки чаще всего возникают из-за неправильного объявления файлов внутри файла karma.config.js. Для настройки karma-jasmine все файлы внутри file:[] блока файла karma.config.js должны быть в той последовательности, в которой они должны быть загружены. Основной модуль имеет внедрение зависимостей любой пользовательской службы, затем сначала загружает эту службу, а затем основной модуль.

person samyak bhalerao    schedule 20.04.2015