17

私は現在、中規模の Django アプリケーションのページが正しく GET および POST されていることを確認するためのいくつかの基本的なテストを作成しています。ただし、 django.test.client.Client を使用しても、失敗するはずのときに確実に失敗するわけではありません。コードに明らかにエラーが配置されている場合でも、302 応答が返されます。

私のアプリ/urls.pyで:

url(r'^mymodel/create/$', 
views.MyModelView.as_view(),
name = 'my_model_create'),

次に、意図的に 500 応答を作成しようとして、次のことを行いました。

class MyModelCreateView(MyModelView, CreateView):

    def post(self, request, *args, **kwargs):
        print self.hello
        self.object = MyModel()
        return super(MyModelCreateView, self).post(request, *args, **kwargs)

明らかに、ビューには hello というオブジェクトがありません。これは、ブラウザーを介して要求を送信しようとすると、期待どおりに失敗します。

「print self.hello」を

return HttpResponse(status = 500)

それでも、私はまだ以下を取得します:

#We have a model called Client, so it 
#is imported as RequestClient to avoid conflicts
In [1]: from django.test.client import Client as RequestClient

In [2]: client = RequestClient()

In [3]: response = client.post("/app/mymodel/create/")

In [4]: response.status_code
Out[4]: 302

正しく実行された場合に Client()/RequestClient() が 500 エラーを返さない理由はないため、明らかにここでの問題はキーボードと椅子の間にあります。POST リクエストに対して 200 の応答ではなく 302 の応答を受け取るため、いくつかの問題が発生しますが、これは HttpRedirect を使用していることが原因である可能性があります。

ここで何が問題なのか知っている人はいますか?参考までに、私は Python 2.7 と Django 1.5 を使用しています (ただし、Django 1.4 との互換性が必要になる場合があります)。

4

1 に答える 1

26

リダイレクトが発生する理由は完全には明らかではありませんが、リダイレクトをたどりたい場合は、リダイレクトに従うように指示する必要がありますRequestClient-ドキュメントに従って:

クライアントに設定followするTrueと、すべてのリダイレクトに従い redirect_chain、中間 URL とステータス コードのタプルを含む属性が応答オブジェクトに設定されます。

したがって、テスト コードは次のようになります。

response = client.post("/app/mymodel/create/", follow=True)

リクエストチェーンをチェックして、正確にどこにルーティングされたかを確認する価値があります。

于 2013-06-27T22:47:47.840 に答える