2012-05-06 12 views
6

Sto provando ad automatizzare le prove su 404 pagine utilizzando il framework di test di Django 1.4.Come testare 404 NOT FOUND con il framework di test di django?

Se si stampa 127.0.0.1:8000/something/really/weird/ nella barra degli indirizzi del browser con il server di sviluppo in esecuzione, vedo una pagina 404, con lo stato "404 NOT FOUND" corretto (come mostra firebug).

Ma se provo ad usare questo codice per il test:

from django.test import TestCase 
class Sample404TestCase(TestCase): 
    def test_wrong_uri_returns_404(self): 
     response = self.client.get('something/really/weird/') 
     self.assertEqual(response.status_code, 404) 

il test fallisce con questa uscita:

$./manage.py test main 
Creating test database for alias 'default'... 
.F 
====================================================================== 
FAIL: test_wrong_uri_returns_404 (main.tests.Sample404TestCase) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File ".../main/tests.py", line 12, in test_wrong_uri_returns_404 
    self.assertEqual(response.status_code, 404) 
*AssertionError: 200 != 404* 

---------------------------------------------------------------------- 
Ran 2 tests in 0.031s 

FAILED (failures=1) 
Destroying test database for alias 'default'... 

Sono seriamente sorpreso con ottenere 200 codice qui. Qualcuno ha idea sul perché questo sta accadendo?

aggiornamento:

qui sta urls.py: http://pastebin.com/DikAVa8T ed effettiva prova di difetto è:

def test_wrong_uri_returns_404(self): 
    response = self.client.get('/something/really/weird/') 
    self.assertEqual(response.status_code, 404) 

tutto sta accadendo nel progetto https://github.com/gbezyuk/django-app-skeleton

+0

come è la tua urls.py? Il rispondente di seguito è corretto sul "/" principale, ma anche in questo caso non si dovrebbe ottenere un 200 per un URL senza senso. – Nils

+0

Ho aggiornato la descrizione della domanda. Il file esatto si trova qui: https://github.com/gbezyuk/django-app-skeleton/blob/master/main/urls.py – gbezyuk

risposta

2

Il problema è che la classe ViewFor404 restituisce un codice di stato 200. Guarda la definizione TemplateView di Django:

class TemplateView(TemplateResponseMixin, View): 
    """ 
    A view that renders a template. 
    """ 
    def get_context_data(self, **kwargs): 
     return { 
      'params': kwargs 
     } 

    def get(self, request, *args, **kwargs): 
     context = self.get_context_data(**kwargs) 
     return self.render_to_response(context) 

così tutta la vostra classe non è un render_to_response, che genera un '200' risposta.

Se è necessario ignorare il gestore di 404, si dovrebbe fare qualcosa di più come questo nella vista:

return HttpResponseNotFound('<h1>Page not found</h1>') 

(non so l'equivalente in vista di classe-based)

Or meglio ancora, puoi evitare di personalizzare la vista? Per personalizzare il display 404, puoi semplicemente creare un modello 404.html (nella cartella templates/del tuo sito), e verrà raccolto dal visualizzatore degli errori di Django.

+0

Grazie tu! E riguardo la personalizzazione della vista - Io uso .haml invece di .html, quindi ho bisogno di mappare la vista 404 a 404.haml invece di 404.html in qualche modo. – gbezyuk

5

Prova

response = self.client.get('/something/really/weird/') # note the '/' before something 

127.0.0.1:8000/something/really/weird/ è /something/really/weird/ nel percorso relativo alla radice, non

  • something/really/weird
  • something/really/weird/
  • /something/really/weird
+0

Grazie, ma questo non ha cambiato nulla e sto ancora ricevendo il codice 200. – gbezyuk

Problemi correlati