角度测试控制器与工厂

时间:2014-03-12 01:51:56

标签: javascript angularjs jasmine karma-runner karma-jasmine

您好我有这个处理登录的控制器:

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:

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< $提供

我不确定这是否是正确的测试方式,任何建议都会很好。

谢谢。

1 个答案:

答案 0 :(得分:3)

您不能在$provide函数中使用inject,因为前者注册后者使用的提供程序。这样做:

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

        inject(function(someValue) {
            //Rest of the code within the inject..........
        });
    });
});