2013-03-07 8 views
14

Qualcuno conosce un modo per impostare (simulare) l'agente utente dell'oggetto richiesta fornito da FLask (Werkzeug) durante il test dell'unità?Impostazione (mocking) delle intestazioni di richiesta per il test dell'unità Flask

Allo stato attuale, quando cerco di ottenere dettagli come request.headers ['User-Agent'] viene sollevato un KeyError poiché il Flask test_client() non li imposta. (Vedere la traccia parziale dello stack di seguito)

Quando si tenta di ottenere l'agente utente dall'oggetto richiesta in un progetto Flask durante il test dell'unità, viene sollevato un errore chiave.

File "/Users/me/app/rest/app.py", line 515, in login 
    if request.headers['User-Agent']: 
File "/Users/me/.virtualenvs/app/lib/python2.7/site-packages/werkzeug/datastructures.py", line 1229, in __getitem__ 
    return self.environ['HTTP_' + key] 
    KeyError: 'HTTP_USER_AGENT' 

- AGGIORNAMENTO -

Insieme con la soluzione (accettato) di seguito, il suggerimento environ_base mi portano a questo altro SO solution. La premessa di questa soluzione è di creare una classe wrapper per l'app Flask e sovrascrivere il metodo per impostare automaticamente le variabili d'ambiente. In questo modo, le variabili sono impostate per tutte le chiamate. Quindi, la soluzione che ho finito per attuare è la creazione di questa classe proxy:

class FlaskTestClientProxy(object): 
    def __init__(self, app): 
     self.app = app 

    def __call__(self, environ, start_response): 
     environ['REMOTE_ADDR'] = environ.get('REMOTE_ADDR', '127.0.0.1') 
     environ['HTTP_USER_AGENT'] = environ.get('HTTP_USER_AGENT', 'Chrome') 
     return self.app(environ, start_response) 

E poi avvolgere il contenitore WSGI con quella delega:

app.wsgi_app = FlaskTestClientProxy(app.wsgi_app) 
test_client = app.test_client() 

risposta

21

È necessario passare in environ_base quando si chiama get() o post() . Per esempio,

client = app.test_client() 
response = client.get('/your/url/', 
         environ_base={'HTTP_USER_AGENT': 'Chrome, etc'}) 

Allora la vostra request.user_agent dovrebbe essere quello che passa in, ed è possibile accedervi tramite request.headers['User-Agent'].

Vedere http://werkzeug.pocoo.org/docs/test/#testing-api per ulteriori informazioni.

+0

Grazie! Anche se ho finito per utilizzare la soluzione che ho incluso nella mia domanda originale sopra, questo avrebbe funzionato perfettamente bene. – prschmid

+0

Bello, penso che la soluzione sia molto più elegante se hai bisogno di impostare quelle variabili d'ambiente su tutti i tuoi test ... In effetti penso che mi hai convinto a cambiare le mie app Flask per fare la stessa cosa! –

+0

Fantastico. Felice di poterti aiutare! – prschmid

Problemi correlati