2012-11-22 6 views
18

Sto usando Python e Webtest per testare un'applicazione WSGI. Ho trovato che le eccezioni sollevate nel codice del gestore tendono ad essere inghiottito da WebTest, che poi solleva un generico:Individuazione dell'errore reale in un errore test di Webtest

AppError: Bad response: 500 Internal Server Error 

Come faccio a dire che per alzare o stampare l'errore originale che ha causato questo?

+0

Ci saranno 'error' reindirizzati ad alcuni file in WSGI config. È possibile effettuare il check-in per ottenere l'errore su alcuni file. – Nilesh

risposta

3

Il framework e il server WSGI contengono gestori che catturano eccezioni ed eseguono alcune azioni (eseguono il rendering di uno stacktrace nel corpo, registrano il backtrace in un file di registro, ecc.). Webtest, per impostazione predefinita, non mostra la risposta effettiva, che potrebbe essere utile se il framework esegue il rendering di uno stacktrace nel corpo. Io uso la seguente estensione a WebTest quando ho bisogno di guardare il corpo della risposta:

class BetterTestApp(webtest.TestApp): 

    """A testapp that prints the body when status does not match.""" 

    def _check_status(self, status, res): 
     if status is not None and status != res.status_int: 
      raise webtest.AppError(
       "Bad response: %s (not %s)\n%s", res.status, status, res) 
     super(BetterTestApp, self)._check_status(status, res) 

Ottenere un maggiore controllo su ciò che accade a eccezione dipende da ciò che framework e server in uso. Per il modulo integrato wsgiref potresti riuscire a sostituire lo error_output per ottenere ciò che desideri.

+0

Segnalato a monte: https://github.com/Pylons/webtest/issues/176 –

2

Mentre la risposta di CLJ funziona certamente, si può ancora voglia di accedere alla risposta nel caso di test. Per fare ciò, è possibile utilizzare expect_errors=True (dallo webtest documentation) quando si effettua la richiesta a TestApp, e in questo modo non verrà generato alcun errore di applicazione. Ecco un esempio in cui mi aspetto un errore 403:

# attempt to access secure page without logging in 
response = testapp.get('/secure_page_url', expect_errors=True) 

# now you can assert an expected http code, 
# and print the response if the code doesn't match 
self.assertEqual(403, response.status_int, msg=str(response)) 
+0

Grazie per questo! Non stavo riuscendo a cogliere le altre eccezioni nei miei test fino a quando non ho visto questo expect_errors arg. –

Problemi correlati