2017-11-20 6 views
1

Djangoでは、私はビューを持っています。これは特定のユーザーのために登録ページにリダイレクトされます。このためのテストを書いてみたいと思います。Django testing:RequestFactory()リダイレクトに従います

標準のrequest.client.getを使用してユーザーを指定することはできません(デフォルトではanonymous_user?がデフォルトです)。動作をテストできません。

RequestFactory()request.userと指定することができました。ただし、リダイレクトに従わず、テストが失敗します。

from .views import my_view 
from django.test import RequestFactory() 

def test_mytest(self): 
    user = create_guest_user() 
    self.factory = RequestFactory() 
    request = self.factory.get(reverse('my_view'), follow=True) 
    request.user = user 
    response = my_view(request) 
    self.assertContains(response, "page where redirected should contain this") 

それは、このエラーメッセージで最後の行に失敗します。これを行う方法を

AssertionError: 302 != 200 : Couldn't retrieve content: Response code was 302 (expected 200) 

任意のアイデア?

EDIT:これはRequestFactory()を指しているので、これは複写ではありません。self.client.getfollow=Trueは問題を解決します)とは異なります。

+1

の可能性のある重複した[ジャンゴ:ページが目的のURLにリダイレクトしている場合のテスト](https://stackoverflow.com/questions/14951356/django-testing-if-the-page-has-the-desired-url-desired-url) –

+0

これは重複していません。その場合、フォーカスは 'SimpleTestCase'であり、ここでは' RequestFactory'クラスについて話しています。 'assertRedirect'以外のリダイレクトにも従います。 – surfer190

+1

' RequestFactory() 'リクエストに従うことはできません。単に 'request'オブジェクトを生成します。 'RequestFactory'を使用する場合は、レスポンスコードを確認し、リダイレクト場所を取得し、その場所をビューに解決してから、そのビューを呼び出す必要があります。 'client'はあなたのためにそれをすべて世話するように設計されているので、代わりに使うべきです。 – Alasdair

答えて

1

デフォルトジャンゴclientを認証するために、あなたはあなたのclientforce_loginメソッドを使用することができます。

user = create_guest_user() 
self.client.force_login(user) 

をあなたのサイトには、Djangoの認証システムを使用している場合は、あなたが効果をシミュレートするためにforce_login()メソッドを使用することができますサイトにログインしているユーザーのテストにユーザーがログインする必要があり、ログインしたユーザーの詳細が重要でない場合は、login()の代わりにこのメソッドを使用します。

テストclientを使用したリダイレクト(またはしない)に追従するために、ここで説明するように、あなたは、follow引数を使用する必要があります。https://docs.djangoproject.com/en/1.11/topics/testing/tools/#django.test.Client.get

self.client.get(url, follow=True) 

あなたは、クライアントが続くTrueに従って設定した場合すべてのリダイレクトとredirect_chain属性が、中間URLとステータスコードのタプルを含むレスポンスオブジェクトに設定されます。

だからあなたの完全なコードは次のようになります。

from django.test import TestCase 

class MyTestCase(TestCase): 
    def test_mytest(self): 
     user = create_guest_user() 
     self.client.force_login(user) 
     response = self.client.get(reverse('my_view'), follow=True) 
     # Do your assertions on the response here 
+1

この回答は、downvoteに値するものではありません。 OPがリダイレクトに従ったければ、RequestFactory()の代わりに 'client'を使うべきです。この回答は、クライアントを使用する際の匿名ユーザーの問題を回避する方法を示しています。 – Alasdair

関連する問題