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örepython 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
Ancak, cevabınıza göre django 404 yanıt kodunu döndürmeli, bir django hatası değil mi? – AlejandroPerezLillo