2012-11-22 12 views
18

Używam Pythona i testu internetowego do testowania aplikacji WSGI. Okazało się, że wyjątki podniesione w kodzie programu obsługi wydają się być połknięte przez Webtest, który następnie podnosi ogólny:Znajdowanie prawdziwego błędu w niepowodzeniu testu Webtestu

AppError: Bad response: 500 Internal Server Error 

Jak mogę powiedzieć to, aby podnieść lub wydrukować oryginalny błąd powodujący, że to?

+0

Pojawi się "błąd" przekierowany do jakiegoś pliku w konfiguracji WSGI. Możesz to sprawdzić, aby uzyskać błąd w niektórych plikach. – Nilesh

Odpowiedz

3

Twój szkielet WSGI i serwer zawiera programy obsługi przechwytywania wyjątków i wykonuje pewne działania (renderowanie stosu w ciele, rejestrowanie śledzenia wstecznego do pliku dziennika itp.). Test sieci Web domyślnie nie pokazuje rzeczywistej odpowiedzi, co może być przydatne, jeśli struktura renderuje stos w ciele. Używam następujące rozszerzenie Webtest kiedy trzeba spojrzeć na ciele odpowiedzi:

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) 

Pierwsze większą kontrolę nad tym co się dzieje z wyjątkiem zależy od ramy i serwer używasz. Dla wbudowanego modułu wsgiref możesz być w stanie zastąpić error_output, aby osiągnąć to, co chcesz.

+0

Zgłoszone upstream: https://github.com/Pylons/webtest/issues/176 –

2

Podczas gdy odpowiedź clj na pewno działa, nadal możesz chcieć uzyskać dostęp do odpowiedzi w teście. Aby to zrobić, możesz użyć expect_errors=True (z webtest documentation), kiedy przekażesz swoje żądanie do TestApp, i w ten sposób nie podniesie się AppError. Oto przykład, w którym spodziewam się błędu 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

Dzięki za to! Nie udało mi się złapać innych wyjątków w swoich testach, dopóki nie zobaczyłem tego spodziewanego argumentu. –

Powiązane problemy