7

Djangoテストクライアントを使用してdjango.test.client.Client、Djangoアプリでいくつかのビューをテストしています。特に、ビューがget_object_or_404メソッドを呼び出し、オブジェクトがそこにない場合をテストしているので、404が返されるはずです。

私のテストコードは次のようになります。

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)

ただし、代わりに取得しているのは、ビューコードの未処理の例外エラーです。

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.

Django1.3のドキュメントによると

テストクライアントに表示されない唯一の例外は、Http404、PermissionDenied、およびSystemExitです。Djangoはこれらの例外を内部でキャッチし、適切なHTTP応答コードに変換します。このような場合、テストでresponse.status_codeを確認できます。

この場合、DjangoがHttp404例外をキャッチしないのはなぜですか?

(ドキュメントに準拠して)例外がテストクライアントにスローされないことに注意してください。クライアント側で例外をキャッチしようとすると、次のようになります。

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

同じエラーと追加のエラーが発生します。

AssertionError: Http404 not raised
4

2 に答える 2

6

これは少し前のことですが、解決したので共有する価値があると思いました。あなたがする必要があるのはあなたのコードのエラーハンドラーをカスタマイズすることです。たとえば、私は次のようにしています。

urls.py:

from myapp.views import error_handler
handler404 = error_handler.error404

および関数error404:

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

    return HttpResponseNotFound(html)

オブジェクトを送信するHttpResponseNotFoundと、404ステータスコードとして解釈されます。

編集

404.htmldjangoの新しいバージョンでは、テンプレートディレクトリにを置くだけで大丈夫です。上記のコントローラーは、エラーページを表示するだけでなく、より多くのロジックが必要な場合にのみ必要です。

于 2013-02-21T15:39:21.413 に答える
2

さらに調べてみると、テストは書かれているとおりに合格しているように見えます。エラー メッセージは、実際にはテストの失敗に対応していません。

于 2012-01-22T12:50:46.683 に答える