javascript - 带工厂的 Angular Testing Controller

标签 javascript angularjs jasmine karma-runner karma-jasmine

你好,我有这个处理登录的 Controller :

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 < $provide

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

谢谢。

最佳答案

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

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

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

关于javascript - 带工厂的 Angular Testing Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22340423/

相关文章:

javascript - JavaScript 中的全局变量到局部变量

javascript - d3 饼图/ donut chart 中标签的过渡

javascript - 使用 Angular.js 创建多个 View 来显示同一模型的不同部分?

javascript - AngularJS 中的 Phonegap ondeviceready 事件

使用 "controller as"语法的 AngularJS Controller 单元测试

unit-testing - 你如何用 Jasmine 监视 AngularJS 的 $timeout ?

javascript - "href' s“是在网站内切换页面的正确方法吗?

javascript - 如何实现 f(g) == g(f)

javascript - ng-view 中的嵌套指令在 AngularJs 中不起作用

javascript - Jasmine 单元测试中未调用 Angular $http.get 成功处理程序