2014-05-16 4 views
5

Ich erstelle ein SPA mit AngularJs und dem UI-Router von Angular-UI. Jetzt versuche ich die Authentifizierungslogik zu erstellen.AngulaJs UI-Router. Winkelmesserprüfung fehlgeschlagen

Bei einer Statusänderung wird überprüft, ob der Status eine Authentifizierung erfordert und ggf. in den Anmeldestatus übertragen wird. Auch wenn ein Benutzer angemeldet ist, wird verhindert, dass der Login-Status erreicht wird. Die Authentifizierung erfolgt über ein Token, das in einem Cookie gespeichert ist.

Das ist mein Winkelmesser Testszenario:

describe('Routes', function() { 
it('Should go to the selected path if user logged in', function() { 
    browser.get('/'); 
    expect(browser.getLocationAbsUrl()).toMatch("/login"); 

    browser.manage().addCookie("authToken", "aaa"); 

    browser.manage().getCookie("authToken").then(function(cookie) { 
     expect(cookie.name).toBe('authToken'); 
     expect(cookie.value).toBe('aaa'); 
    }); 

    browser.get('/'); 
    expect(browser.getLocationAbsUrl()).toMatch("/main"); 

    browser.get('/#/main'); 
    expect(browser.getLocationAbsUrl()).toMatch("/main"); 

    /* This part fails, because, when the user is logged in, 
    he should be transfered to main state, if he is trying to reach the 
    login page. In this failing case, the user is able to reach the 
    /login even if he is logged in. */ 

    browser.get('/#/login'); 
    expect(browser.getLocationAbsUrl()).toMatch("/main"); 

    browser.manage().deleteCookie("authToken"); 

    browser.get('/#/login'); 
    expect(browser.getLocationAbsUrl()).toMatch("/login"); 

    browser.get('/#/main'); 
    expect(browser.getLocationAbsUrl()).toMatch("/login"); 
}); 

});

Wenn ich versuche, den Test Verhalten selbst zu simulieren, ist alles in Ordnung, aber wenn ich laufe Winkelmesser:

Message: 
Expected 'http://localhost/#/login' to match '/main'. 

Stacktrace: Fehler: Fehler Erwartung

Antwort

0

Unter Umständen müssen Sie für die Seite warten geladen werden:

browser.get('/#/main'); 
var ptor = protractor.getInstance(); 
ptor.waitForAngular(); 
expect(browser.getLocationAbsUrl()).toMatch("/main"); 
+0

kein Glück, Test nicht noch – nn4n4s

+0

Haben Sie die richtige Seite geladen wird, wenn die Tests ausgeführt werden? Wenn ja, versuche es mit 'ptor.sleep (1000);', das benutze ich, wenn ich verzweifelt bin. Wenn Sie einen besseren Weg finden, lassen Sie es mich wissen ... Wenn Sie nicht sehen, die richtige Seite geladen wird, dann haben Sie vielleicht ein Problem mit dem Löschen von Cookies? – Cal

1

Ich stieß auf eine andere Frage, die dieses Problem gelöst.

Im Grunde warten Sie, bis ein Element auf der neuen Seite erscheint, anstatt sich auf den Winkelmesser zu verlassen, um auf das Laden des Status/der Seite zu warten. Zum Zeitpunkt des Schreibens dieser Antwort ist der Winkelmesser auf der vollständig für den UI-Router geladenen Warteseite immer noch unzuverlässig. Der Winkelmesser wartet auf $ timeout und $ http.

official doc

so, wenn Sie websocket verwenden, könnte es nicht (zumindest nach meiner Beobachtung) abgedeckt werden.

Die api Sie verwenden müssen, ist browser.wait

browser.wait(function() { 
     return $('#test321').isPresent(); // keeps waiting until this statement resolves to true 
     }, 
     timeToWaitInMilliseconds, 
     'message to log to console if element is not present after that time' 
    ); 

    expect($('#test321').isPresent()).toBe(true); 

Details finden Sie in den folgenden Link Protractor, AngularJS, Parse -- Protractor does not wait for Angular to resolve

0

Beachten Sie, dass in Angular Version 1.3 browser.getLocationAbsUrl() gibt nur den relativen Pfad. Sehen Sie sich die Ausgabe in https://github.com/angular/protractor/issues/1436:

Using angular 1.3 in the app under test and protractor 1.3.1 browser.getLocationAbsUrl() returns a relative url instead of the absUrl due to using angular.getTestability().getLocation() instead of $location.absUrl(). It's probably as easy as adding a getLocationAbs() to $$testability, but that goes into architectural questions I don't have context for.

Verwandte Themen