2014-04-18 26 views
8

Attualmente sto cercando di scrivere alcuni test unitari per l'applicazione Flask. In molte delle mie funzioni di visualizzazione (come il mio login), reindirizzo a una nuova pagina. Quindi, ad esempio:Test reindirizzamento nel pallone con Python Unittest

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

Sto provando a verificare che questo reindirizzamento avvenga nei miei test di unità. In questo momento, ho:

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')) 

Questa funzione assicurarsi che la risposta restituita è di 200, ma l'ultima riga non è ovviamente sintassi valida. Come posso affermarlo? La mia funzione è semplicemente create_user:

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) 

Grazie!

risposta

7

Prova Flask-Testing

c'è API per assertRedirects è possibile utilizzare questo script

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) 

TEST:

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

Flask ha built-in testing hooks e un client di prova, che le grandi opere per roba funzionale come questo.

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') 

La documentazione hanno più informazioni su come fare questo, anche se FYI se si vede "flaskr", questo è il nome della classe di test e non nulla in Flask, che mi ha confuso la prima volta che l'ho visto.

+1

Incoraggio fortemente le persone a utilizzare questa soluzione, che rimuove la dipendenza da Flask-Testing (in generale, penso che l'uso delle poche estensioni possibili sia una buona cosa, o solo le "stabili" e "grandi", come Flask -Principal, Flask-Security, ecc.). Tuttavia, questa soluzione solleva un 'RuntimeError: Tentativo di generare un URL senza che venga premuto il contesto dell'applicazione. Questo deve essere eseguito quando il contesto dell'applicazione è disponibile', perché 'url_for' ha bisogno del contesto dell'applicazione. Tutto quello che devi fare è metterlo in un 'con app.app_context():' – Edouardb

4

Un modo è quello di non seguire i reindirizzamenti (o rimuovere follow_redirects dalla richiesta o impostarlo esplicitamente su False).

Quindi, è possibile sostituire semplicemente self.assertEquals(rv.status, "200 OK") con:

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

Se si desidera continuare a utilizzare follow_redirects per qualche ragione, un altro modo (un po 'fragile) è quello di verificare la presenza di qualche stringa cruscotto atteso, come un elemento HTML ID nella risposta di rv.data. per esempio. self.assertIn('dashboard-id', rv.data)

Problemi correlati