10

Django 1.4 のテスト フレームワークを使用して 404 ページのテストを自動化しようとしています。

開発サーバーが実行されている状態でブラウザーのアドレスバーに印刷127.0.0.1:8000/something/really/weird/すると、正しい「404 NOT FOUND」ステータスの 404 ページが表示されます (firebug が示すように)。

しかし、このコードをテストに使用しようとすると:

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)

テストは次の出力で失敗します。

$./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'...

ここで 200 のコードを取得できたことに、私は非常に驚いています。なぜ地球上でこれが起こっているのか、誰にも分かりますか?

更新しました:

ここに urls.py があります: http://pastebin.com/DikAVa8T で、実際に失敗したテストは次のとおりです。

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

プロジェクトhttps://github.com/gbezyuk/django-app-skeletonですべてが起こっています

4

2 に答える 2

6

試す

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

127.0.0.1:8000/something/really/weird//something/really/weird/ルートからの相対パスにあります。

  • something/really/weird
  • something/really/weird/
  • /something/really/weird
于 2012-05-06T07:56:46.303 に答える
4

問題は、ViewFor404 クラスが 200 ステータス コードを返すことです。Django の TemplateView 定義を見てください。

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)

したがって、クラスが行うのは、「200」応答を生成する render_to_response だけです。

404 ハンドラーをオーバーライドする必要がある場合は、ビューで次のようにする必要があります。

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

(クラスベースのビューに相当するものはわかりません)

または、さらに良いことに、ビューのカスタマイズを回避できますか? 404 表示をカスタマイズするには、(サイトの templates/ ディレクトリに) 404.html テンプレートを作成するだけで、Django のエラー ビューアーによって取得されます。

于 2012-05-21T07:59:46.573 に答える