2012-01-22 10 views
7

Django uygulamasında bazı görünümleri test etmek için Django test istemcisini kullanıyorum django.test.client.Client. Özellikle, görüntünün get_object_or_404 yöntemini çağırdığı ve nesnenin orada bulunmadığı bir durumu test ediyorum, böylece bir 404 döndürülmelidir.Django sınama istemcisiyle beklenen 404 testi, işlenmeyen bir istisna yol açar

Testim kodu şöyle: Ancak

class ViewTests(TestCase): 
    fixtures=['test.json'] 

    def test_thing_not_there_get(self): 
     url = '/foo/30afda98-b9d7-4e26-a59a-76ac1b6a001f/' 
     c = django.test.client.Client() 
     response = c.get(url) 
     self.assertEqual(response.status_code, 404) 

, ne yerine alıyorum işlenmeyen bir özel durum görünümü kodunda hatadır: Django 1.3 docs

göre

python projects/unittests/manage.py test 
Creating test database for alias 'default'... 
......ERROR:root:Unhandled Exception on request for http://testserver/foo/30afda98-b9d7-4e26-a59a-76ac1b6a001f/ 
Traceback (most recent call last): 
    File "/Users/lorin/.virtualenvs/myvenv/lib/python2.7/site-packages/django/core/handlers/base.py", line 111, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 
    File "/Users/lorin/.virtualenvs/myvenv/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 39, in wrapped_view 
    resp = view_func(*args, **kwargs) 
    File "/Users/lorin/.virtualenvs/myvenv/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 52, in wrapped_view 
    return view_func(*args, **kwargs) 
    File "/Users/lorin/django-myvenv/apps/myvenv_desktop/views.py", line 85, in foo_view 
    instance = get_object_or_404(Foo, uuid=foo_uuid) 
    File "/Users/lorin/.virtualenvs/myvenv/lib/python2.7/site-packages/django/shortcuts/__init__.py", line 115, in get_object_or_404 
    raise Http404('No %s matches the given query.' % queryset.model._meta.object_name) 
Http404: No Foo matches the given query. 

The only exceptions that are not visible to the test client are Http404, PermissionDenied and SystemExit. Django catches these exceptions internally and converts them into the appropriate HTTP response codes. In these cases, you can check response.status_code in your test.

Bu durumda Django neden Http404 kuralını yakalamıyor?

Not: (docs ile uyumlu olarak), istisna, test istemcisine atılan'dir. Ben istemci tarafında durum yakalamak için deneyin: Ben aynı hatayı alıyorum

with self.assertRaises(django.http.Http404): 
    response = c.get(url) 

yanı sıra ek bir hata: Test geçiyor gibi ayrıntılı incelenmesi üzerine

AssertionError: Http404 not raised 
+0

Ancak, cevabınıza göre django 404 yanıt kodunu döndürmeli, bir django hatası değil mi? – AlejandroPerezLillo

cevap

6

Bunun bir süre önce olduğunu biliyorum, ama bunu çözdüm, bu yüzden paylaşmaya değer olduğunu düşündüm. Yapmanız gereken, kodunuzdaki hata işleyicisini özelleştirmek. Örneğin, ben var:

urls.py içinde:

from myapp.views import error_handler 
handler404 = error_handler.error404 

ve fonksiyon error404:

from django.http import HttpResponseNotFound 
def error404(request): 
    t = loader.get_template('404.html') 
    html = t.render(Context()) 

    return HttpResponseNotFound(html) 

Bir HttpResponseNotFound nesne gönderirseniz, 404 durum kodu olarak yorumlayacaktır. daha yeni sürümlerinde

DÜZENLEME

sadece şablonları dizininde bir 404.html koymak onun ok django. Yukarıdaki denetleyici, yalnızca hata sayfasını göstermekten daha fazla mantığa ihtiyacınız varsa gereklidir.

2

, görünüşe yazıldığı gibi: hata mesajı aslında bir test arızasına uymuyor.

İlgili konular