Карма - Неизвестная ошибка провайдера: menuFactoryProvider ‹- menuFactory

При попытке протестировать мой контроллер Karma выдает ряд ошибок, начинающихся с:

Карма - Ошибка: [$injector:unpr] Неизвестный провайдер: menuFactoryProvider ‹- menuFactory

Кажется, что menuFactory (который теперь является службой) неправильно внедряется, но я не могу понять, почему. Выход кармы показан здесь для ясности:

введите здесь описание изображения

Вот мой menucontroller-test.js:

describe('Controller: MenuController', function () {

  // load the controller's module
  beforeEach(module('confusionApp'));

  var MenuController, scope, $httpBackend;

});

  // Initialize the controller and a mock scope
  beforeEach(inject(function ($controller, _$httpBackend_,  $rootScope, menuFactory) {

          // place here mocked dependencies
      $httpBackend = _$httpBackend_;

      $httpBackend.expectGET("http://localhost:3000/dishes").respond([
        {
      "id": 0,
      ...
      },
      {
      "id": 1,
      ...
      }
      ]);

    scope = $rootScope.$new();
    MenuController = $controller('MenuController', {
      $scope: scope, menuFactory: menuFactory
    });
            $httpBackend.flush();

  }));

    it('should have showDetails as false', function () {

    expect(scope.showDetails).toBeFalsy();

  });
  ...
  });

Выдержка из controllers.js

'use strict';

angular.module('confusionApp')

        .controller('MenuController', ['$scope', 'menuFactory', function($scope, menuFactory) {

            $scope.tab = 1;
            $scope.filtText = '';
            $scope.showDetails = false;
            $scope.showMenu = false;
            $scope.message = "Loading ...";

            menuFactory.getDishes().query(
                function(response) {
                    $scope.dishes = response;
                    $scope.showMenu = true;
                },
                function(response) {
                    $scope.message = "Error: "+response.status + " " + response.statusText;
                });

Выдержка из services.js (еще раз обратите внимание, что menuFactory на самом деле является сервисом, а не фабрикой)

'use strict';

angular.module('confusionApp')
        .constant("baseURL", "http://localhost:3000/")
        .service('menuFactory', ['$resource', 'baseURL', function($resource, baseURL) {

            var promotions = [
                {
                          _id:0,
                          name:'Weekend Grand Buffet', 
                          image: 'images/buffet.png',
                          label:'New',
                          price:'19.99',
                          description:'Featuring mouthwatering combinations with a choice of five different salads, six enticing appetizers, six main entrees and five choicest desserts. Free flowing bubbly and soft drinks. All for just $19.99 per person ',
                }

            ];

                this.getDishes = function(){
                                        return $resource(baseURL+"dishes/:id",null,  {'update':{method:'PUT' }});
                                    };

                // implement a function named getPromotion
                // that returns a selected promotion.
                this.getPromotion = function(index) {
                          return promotions[index];
                };


        }])

person CryptoPiggy    schedule 27.07.2016    source источник


Ответы (1)


вы случайно закрыли метод описания после внедрения модуля, поэтому он не смог внедрить вашу службу. Теперь это работает!

describe('Controller: MenuController', function () {

      // load the controller's module
      beforeEach(module('confusionApp'));

      var MenuController, scope, $httpBackend,menuFactory;       

      // Initialize the controller and a mock scope
      beforeEach(inject(function ($injector,$controller, _$httpBackend_,  $rootScope, _menuFactory_) {

              // place here mocked dependencies
          $httpBackend = _$httpBackend_; 
          menuFactory = $injector.get('menuFactory');                 
          $httpBackend.expectGET("http://localhost:3000/dishes").respond([
            {
          "id": 0,
          ...
          },
          {
          "id": 1,
          ...
          }
          ]);

        scope = $rootScope.$new();
        MenuController = $controller('MenuController', {
          $scope: scope, menuFactory: menuFactory
        });
                $httpBackend.flush();

      }));

        it('should have showDetails as false', function () {

        expect(scope.showDetails).toBeFalsy();

      });
      ...
      });
 });
person Jorawar Singh    schedule 27.07.2016
comment
Привет Джоравар. Я попробовал вашу конфигурацию, и Карма все еще возвращает Error: [$injector:unpr] Unknown provider: menuFactoryProvider <- menuFactory - person CryptoPiggy; 27.07.2016
comment
вы добавляете этот файл в karma-config? - person Jorawar Singh; 27.07.2016
comment
Он добавлен с помощью 'app/scripts/*.js'. Я могу попробовать явно добавить controllers.js, чтобы быть уверенным. - person CryptoPiggy; 27.07.2016
comment
Посмотрите в браузере, что он загружается правильно - person Jorawar Singh; 27.07.2016
comment
О, вы, вероятно, имели в виду тестовый файл. Это добавлено с помощью 'test/unit/**/*.js' - person CryptoPiggy; 27.07.2016
comment
я имею в виду, что ваш служебный файл загружается в браузер правильно. - person Jorawar Singh; 27.07.2016
comment
в браузере хром карма запускает? "Карма v1.1.1 - подключена" и т.д.. - person CryptoPiggy; 27.07.2016
comment
Давайте продолжим это обсуждение в чате. - person Jorawar Singh; 27.07.2016