2014-04-18 11 views
8

Ich versuche gerade, einige Komponententests für meine Flask-Anwendung zu schreiben. In vielen meiner Ansichtsfunktionen (wie beispielsweise meinem Login) leite ich auf eine neue Seite um. So zum Beispiel:Testumleitung in Flask mit Python Unitest

@user.route('/login', methods=['GET', 'POST']) 
def login(): 
    .... 
    return redirect(url_for('splash.dashboard')) 

Ich versuche zu überprüfen, dass diese Umleitung in meinen Komponententests passiert. Gerade jetzt, ich habe:

def test_register(self): 
    rv = self.create_user('John','Smith','[email protected]', 'helloworld') 
    self.assertEquals(rv.status, "200 OK") 
    # self.assert_redirects(rv, url_for('splash.dashboard')) 

Diese Funktion ist sicher, dass die zurückgegebene Antwort ist 200, aber die letzte Zeile ist offensichtlich nicht gültig Syntax. Wie kann ich das behaupten? Meine create_user Funktion ist einfach:

def create_user(self, firstname, lastname, email, password): 
     return self.app.post('/user/register', data=dict(
      firstname=firstname, 
      lastname=lastname, 
      email=email, 
      password=password 
     ), follow_redirects=True) 

Dank! Versuchen

Antwort

7

Flask-Testing

wird api für assertRedirects können Sie diese

assertRedirects(response, location) 

Checks if response is an HTTP redirect to the given location. 
Parameters: 

    response – Flask response 
    location – relative URL (i.e. without http://localhost) 

Testskript verwenden:

def test_register(self): 
    rv = self.create_user('John','Smith','[email protected]', 'helloworld') 
    assertRedirects(rv, url of splash.dashboard) 
5

Flask hat built-in testing hooks und einen Test-Client, der für funktionelle Sachen große Werke so was.

from flask import url_for 
import yourapp 

test_client = yourapp.app.test_client() 
response = test_client.get(url_for('whatever.url'), follow_redirects=True) 

# check that the path changed 
assert response.request.path == url_for('redirected.url') 

Die docs haben mehr Informationen darüber, wie dies zu tun, obwohl FYI, wenn Sie „flaskr“ zu sehen, dass der Name der Testklasse ist und nicht alles in Fläschchen, die mir das erste Mal verwirrt ich es sah.

+1

Ich ermutige stark Leute, diese Lösung zu verwenden, die Flask-Testing-Abhängigkeit entfernt (im Allgemeinen denke ich, so wenig Erweiterungen zu verwenden ist eine gute Sache, oder nur die "stabilen" und "großen", wie Flask -Principal, Flask-Sicherheit, etc.). Diese Lösung löst jedoch einen RuntimeError aus: Es wurde versucht, eine URL zu generieren, ohne dass der Anwendungskontext übertragen wurde. Dies muss ausgeführt werden, wenn der Anwendungskontext verfügbar ist, da "url_for" einen Anwendungskontext benötigt. Alles, was Sie tun müssen, ist es in ein '' mit app.app_context(): ' – Edouardb

4

Eine Möglichkeit besteht darin, den Weiterleitungen nicht zu folgen (entfernen Sie entweder follow_redirects aus Ihrer Anforderung, oder legen Sie sie explizit auf False fest).

Dann Sie einfach self.assertEquals(rv.status, "200 OK") mit ersetzen:

self.assertEqual(rv.status_code, 302) 
self.assertEqual(rv.location, url_for('splash.dashboard', _external=True)) 

Wenn Sie mit follow_redirects aus irgendeinem Grunde fortzusetzen, eine andere (etwas spröde) Art und Weise ist für einige erwartete Armaturenbrett Schnur, wie ein HTML-Element zu überprüfen ID in der Antwort von rv.data. z.B. self.assertIn('dashboard-id', rv.data)