Контроллер Angular Testing с фабрикой

Здравствуйте, у меня есть этот контроллер, который обрабатывает вход в систему:

angular.module('fancyApp')
.controller('MainCtrl', function ($scope, $location, $http, LoginFactory) {
 $scope.loginForm = function(isValid) {

if (isValid) {
 var status;

 LoginFactory.login($scope.person).then(function(d) {
  console.log(d);
  $scope.data = d;

  if (d.status === 200) {
      //login success
      $('.loginFail').hide();
      $location.path('/student');

    } else {
      $scope.loginFail = 'Failed to login';
      $('.loginFail').show();
    }

  });

  } else {
  $scope.login_form.submitted = true;
 }
 };
});

И это моя функция входа в систему LoginFactory:

angular.module('fancyApp')
.factory('LoginFactory', function ($http, $q) {
return {
  login: function(user) {
    var promise = $http.post( 'api/v1/login', user).then(function (response) {
      return response;
    }, function(error) {
      return error;
    });
    return promise;
  };
});

Это мой перед каждым:

beforeEach(inject(function ($controller, $provide, $location, $rootScope) {
location = $location;
rootScope = $rootScope;

var testService = {
  getStudents: function() {
    return ['student1', 'student2'];
  },
  getAdmins: function() {
    return ['admin1', 'admin2'];
  },
  login: function(person) {
    console.log(testService.getStudents().indexOf(person.user));
    if(testService.getStudents().indexOf(person.user) !== -1) {
      return {status:200, token:'xxx', role:'student'};
    }
    else if(testService.getAdmins().indexOf(person.user) !== -1) {
      return {status:200, token:'xxx', role:'admin'};
    }
    else {
      return {status:401, token:'xxx', role:'student'};
    }
  }
};

scope = $rootScope.$new();
$provide.service('LoginService', testService);
MainCtrl = $controller('MainCtrl', {
  $scope: scope
});
}));

И вот мой тест:

it('Login should succeed', inject(function($httpBackend){
    spyOn(testService, 'login');

    scope.person.user = 'student1';
    scope.person.pass = '123456';
    scope.login(true);
    expect(testService.login).toHaveBeenCalledWith('student1', '123456');

  }));

Ошибка, которую я получаю:

Ошибка: [$injector:unpr] Неизвестный провайдер: $provideProvider ‹ $provide

Я не уверен, что это правильный способ тестирования, любые предложения были бы хороши.

Спасибо.


person arni    schedule 12.03.2014    source источник


Ответы (1)


Вы не можете использовать $provide в функции inject, поскольку первая регистрирует провайдеров для использования последней. Сделай это так:

describe('...', function() {
    beforeEach(function() {
        module(function($provide) {
           $provide.service('LoginService', testService);
        });

        inject(function(someValue) {
            //Rest of the code within the inject..........
        });
    });
});
person BKM    schedule 12.03.2014
comment
Просто убедитесь, что модуль находится перед инжектом, иначе вы получите сообщение об ошибке Инжектор уже создан, не может зарегистрировать модуль! - person Tom McKearney; 02.10.2014