2012-11-22 5 views
18

Ich verwende Python und Webtest, um eine WSGI-Anwendung zu testen. Ich fand, dass Ausnahmen in dem Handler Code ausgelöst neigen dazu, durch Webtest geschluckt werden, die dann eine generische aufwirft:Den tatsächlichen Fehler in einem Webtest-Testfehler finden

AppError: Bad response: 500 Internal Server Error 

Wie sage ich es den ursprünglichen Fehler zu erhöhen oder drucken, die dies verursacht?

+0

Es wird 'Fehler' umgeleitet zu einer Datei in WSGI Config. Sie können einchecken, um Fehler in einer Datei zu bekommen. – Nilesh

Antwort

3

Ihr WSGI-Framework und -Server enthält Handler, die Ausnahmen abfangen und bestimmte Aktionen ausführen (einen Stacktrace im Body rendern, das Backtrace in einer Protokolldatei protokollieren usw.). Webtest zeigt standardmäßig nicht die tatsächliche Antwort an, was nützlich sein könnte, wenn Ihr Framework einen StackTrace im Body rendert. Ich verwende die folgende Erweiterung Webtest, wenn ich am Körper der Antwort suchen müssen:

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) 

mehr Kontrolle über das bekommen, was passiert mit der Ausnahme hängt davon ab, welche Rahmenbedingungen und Server Sie verwenden. Für das eingebaute Modul wsgiref können Sie möglicherweise error_output überschreiben, um zu erreichen, was Sie wollen.

+0

Berichtet upstream: https://github.com/Pylons/webtest/issues/176 –

2

Während die Antwort von clj sicher funktioniert, möchten Sie vielleicht trotzdem auf die Antwort in Ihrem Testfall zugreifen. Um dies zu tun, können Sie expect_errors=True (aus dem webtest documentation) verwenden, wenn Sie Ihre Anfrage an die TestApp stellen, und auf diese Weise wird kein AppError ausgelöst. Hier ist ein Beispiel, wo ich einen 403 Fehler erwarte:

# 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

Danke dafür! Ich konnte die anderen Ausnahmen in meinen Tests nicht abfangen, bis ich dieses expect_errors arg sah. –

Verwandte Themen