Javascript Angularjs-如何进行单元测试表单验证

Javascript Angularjs-如何进行单元测试表单验证,javascript,angularjs,jasmine,Javascript,Angularjs,Jasmine,我用它来单元测试我的Angular应用程序。如何在控制器中测试表单验证?例如,我有一个登录功能: $scope.login = function() { if($scope.form_login.$valid) { //send request with username and password }; }; 我正在尝试将$valid设置为true,但无法访问此处的表单。我收到一个错误TypeError:无法设置未定义的属性“$valid”: it('should

我用它来单元测试我的Angular应用程序。如何在控制器中测试表单验证?例如,我有一个登录功能:

$scope.login = function() {
    if($scope.form_login.$valid) {
      //send request with username and password
    };
};
我正在尝试将
$valid
设置为
true
,但无法访问此处的表单。我收到一个错误
TypeError:无法设置未定义的属性“$valid”:

it('should not send request if form validation fails', function() {
    $controller('loginController', {$scope: $scope});
    $scope.form_login.$valid = true;
    $scope.login();
})

单元测试不应该真正测试表单。要测试表单和其他与控制器无关的内容,请使用e2e测试


但是,如果您确实想在单元测试中测试验证,请参阅或

如果您使用服务保存数据

$scope.login = function() {
    if($scope.form_login.$valid) {
      //send request with username and password
      MyService.login();
    };
};
检查您的服务是否未被调用,并将$scope.form_login.$valid属性模拟为false

var MyService, controllerInjector, rootScope;
beforeEach(inject(function($controller, _MyService_, $rootScope){

  controllerInjector = $controller;
  MyService = _MyService_;
  rootScope = $rootScope;

}))

it('should not send request if form validation fails', function() {
  var scope, controller;
  scope = rootScope.$new();
  scope.form_login = {
    $valid : false;
  }
  var loginController = controllerInjector('loginController', {
    $scope : scope
  });

  spyOn(MyService,'login');

  scope.login();

  expect(MyService.login).not.toHaveBeenCalled();

});

回答正确,将尽可能多的代码逻辑从视图移到控制器中,并使用单元测试测试控制器代码,使用量角器e2e测试表单testing@danday74如果使用服务登录,我可能会在单元测试方法中测试没有调用该方法的服务,而且,我可以使用e2e量角器进行集成测试