1

Also in meinem Grundwinkel app habe ich ein Login-Formular:Winkelmesser Funktionstest nicht ng-Modell aktualisiert?

<form layout="column" class="form"> 
    <md-input-container> 
    <label for="email" translate>login.email</label> 
    <input id="email" type="email" ng-model="login.user.email" /> 
    <span ng-bind="login.user.email"></span> 
    </md-input-container> 
    <md-input-container> 
    <label for="password" translate>login.password</label> 
    <input id="password" type="password" ng-model="login.user.password" /> 
    <span ng-bind="login.user.password"></span> 
    </md-input-container> 
    <md-button class="hbd-primary" ng-click="login.authenticate()" id="submit-button"> 
    <span translate>login.connection</span> 
    </md-button> 
</form> 

Ich bin derzeit schriftlich Funktionstests mit Winkelmesser und Jasmin. Hier ist mein Login-Test:

it('should fail login with bogus credentials', function() { 
    page.emailInput.clear().then(function() { 
    page.emailInput.sendKeys('[email protected]'); 
    }); 
    expect(page.emailInput.getAttribute('value')).toBe('[email protected]'); 
    page.passwordInput.clear().then(function() { 
    return page.passwordInput.sendKeys('boguspass'); 
    }) 
    .then(function() { 
    expect(page.passwordInput.getAttribute('value')).toBe('boguspass'); 
    return page.submitButton.click(); 
    }) 
    .then(function() { 
    expect(page.alert.element(by.id("login-alert-text")).getText()) 
     .toBe('Email ou mot de passe invalide'); 
    }); 
}); 

Mein Problem ist mit dem Sendkeys() -Methode, auch wenn sie die E-Mail und das Passwort korrekt schreiben (visuell ist es in den Eingängen), wenn es Login-Funktion auslöst, bemerkte ich etwas seltsam mit der Anfrage params: die Felder Email und Passwort meines Objektbenutzers sind leer zB "". Aber wenn ich das Attribut 'Wert' der Eingaben überprüfe, wird es korrekt ausgefüllt, zB "[email protected]" & "boguspass".

Also suchte ich viel, aber bisher nichts gefunden, ich habe keine Ahnung, wo das Problem ...

Alle Leitungen sehr geschätzt würde sein könnte!

EDIT: zusätzlicher Code von Controller und Service.

Login-Controller

var vm = this; 
vm.errors = ''; 
vm.user = {email: 'a', password: 'a', remember: true}; 
/** 
* 
* Log the user in. 
* 
**/ 
function authenticate() { 
    vm.errors = ''; 
    retrieveToken(vm.user); 
}; 

/** 
* 
* Get the jwt token. Change state depending on status. 
* 
**/ 
function retrieveToken(user) { 
    authService.login(user) 
    .success(function(data, status, headers, config) { 
     saveToken(data.token); 
     $state.go('employee'); 
    }) 
    .error(function(data, status, headers, config) { 
     vm.errors = 'Email ou mot de passe invalide'; 
    }); 
}; 

/** 
* 
* Store the authenticated user. 
* 
**/ 
function saveToken(dataToken) { 
    var token = jwtHelper.decodeToken(dataToken); 
    var user = { 
    id: token.id, 
    firstName: token.firstName, 
    lastName: token.lastName, 
    roles: token.roles, 
    token: dataToken 
    }; 
    authService.setAuthentication(true, user); 
}; 

authService

function auth($injector, constants) { 
    var _authenticated = false; 
    var _user = null; 
    var service = { 
    login: login, 
    isAuthenticated: isAuth, 
    setAuthentication: setAuth, 
    getToken: getToken 
    }; 

    /** 
    * 
    * Get the user authentication jwt. 
    * 
    **/ 
    function login(user) { 
    return $injector.get('$http') 
     .post(constants.baseApiUrl + 'authentication/login', user); 
    }; 

    /** 
    * 
    * Return a boolean to check if user is connected to app. 
    * 
    **/ 
    function isAuth() { 
    return _authenticated; 
    }; 

    /** 
    * 
    * Set the current user authentication. 
    * 
    **/ 
    function setAuth(auth, user) { 
    if (auth) { 
     _authenticated = true; 
     _user = user; 
    } 
    else if (auth === false) { 
     _authenticated = false; 
     _user = null; 
    } 
    }; 

EDIT2: Wenn ich die Felder E-Mail und Passwort auf etwas setzen, ändern Sie diese Werte nicht bei der Authentifizierung, auch mit die clear und sendKeys. Aber visuell werden die Eingaben korrekt gelöscht und gefüllt. Ich vermute also, dass das Problem ein Datenbindungsproblem ist. Vielleicht ist die Zwei-Wege-Bindung in irgendeiner Weise gebrochen.

EDIT3: Ok, also unter jeder Eingabe habe ich einen Bereich mit einer ng-Bindung zu E-Mail und Passwort-Modell hinzugefügt. Wenn sendKeys und clear verwendet werden, ändert sich der spans-Wert nicht (zB 'a'). Es gibt also ein Problem mit der Datenbindung! Wertänderung, wenn ich manuell ein Zeichen von der Eingabe lösche.

Antwort

0

So nach Stunden und Stunden, habe ich die Lösung.

Beim Starten von Funktionstests verwendete ich Browser-Sync und öffnete einen anderen Browser, um zu überprüfen, ob alles in Ordnung war.

Etwas, nach der Verwendung der Browser-Sync-Option open: false und lassen Phantomjs macht es magisch, alles funktioniert. Nicht sicher, warum es ein Problem war, aber jetzt ist es gelöst!

0

In unseren Tests verwenden wir clear und sendKeys, aber bei separaten Aufrufen.

Also für Ihren Fall versuchen:

page.emailInput.clear(); 
page.emailInput.sendKeys('[email protected]'); 

Ein anderer Ansatz - Protractor clear() not working

+0

Danke aber schon ausprobiert. EDIT: IMO es ist ein Winkelproblem, da Modell ist leer, aber nicht der Eingabewert. – Clemator

+0

Also ist der Test tatsächlich vorbei? – mindparse

+0

Ja, weil es den Benutzer {password: "", email: ""} an die Anmeldung sendet, die dann wie erwartet fehlschlägt. – Clemator

Verwandte Themen