2016-04-29 16 views
4

Ich verwende Jasmine, um meine Angular App zu testen. Wie kann ich die Formularvalidierung in meinem Controller testen? Zum Beispiel habe ich eine Login-Funktion:Angularjs - Wie man die Testformularvalidierung einstellt

$scope.login = function() { 
    if($scope.form_login.$valid) { 
     //send request with username and password 
    }; 
}; 

Ich versuche $valid zu true zu setzen, aber ich kann das Formular hier nicht zugreifen. Ich habe einen Fehler TypeError: Cannot set property '$valid' of undefined:

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

Antwort

3

Unit-Test sollte nicht wirklich das Formular testen. Um das Formular und andere nicht Controller-bezogene Dinge zu testen, verwenden Sie e2e-Tests.

Allerdings, wenn Sie wirklich wollen, Validierung in Unit-Test testen, sehen To test a custom validation angularjs directive oder How to unit test angularjs form?

+1

richtige Antwort, bewegen so viel Code Logik wie möglich aus dem Blick in die Steuerung und Test-Controller-Code mit Unit-Tests, Verwendung Winkelmesser e2e-Tests für Formprüfung – danday74

+1

@ danday74 Wenn ein Dienst verwenden, um anmelden, ich testen konnte Service wurde nicht die Methode in einem Unit-Test-Ansatz genannt, und auch könnte ich in einem Integrationsansatz mit e2e Winkelmesser testen –

1

Wenn Sie einen Dienst verwendet, um die Daten zu speichern

$scope.login = function() { 
    if($scope.form_login.$valid) { 
     //send request with username and password 
     MyService.login(); 
    }; 
}; 

Überprüfen Sie, ob Ihr Dienst nicht und verspotten genannt die $ scope.form_login. $ valid Eigenschaft auf 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(); 

}); 
Verwandte Themen