2011-07-21 8 views
1

私は 'permission_required'デコレータを幅広く使用する一連のDjangoアプリケーションをテストしています。これは私が持っているほとんどのビューの302 HTTP応答に由来します。Djangoのテストでpermission_requiredデコレータを使用することはできますか?

私の質問は、テストで 'permission_required'を回避または無効にする方法があるため、302の代わりにビューを呼び出すと200の応答が得られますか?

ありがとうございました!

答えて

5

ちょうどあなたのテストケースの設定方法


from django.test import TestCase 
from django.contrib.auth.models import User 

class TestThatNeedsLogin(TestCase): 
    def setUp(self): 
     User.objects.create_superuser(
      'user1', 
      '[email protected]', 
      'pswd', 
     ) 
     self.client.login(username="user1", password="pswd") 

    def tearDown(self): 
     self.client.logout() 

    def test_something(self): 
     response = self.client.get("/") 
     self.assertEqual(200, response.status_code) 
+0

ありがとうございます。はい、私はあなたの言う通りにテストユーザーを作成しましたが、 'is_superuser'パラメーターが私のために働いていないようです。私はビューにアクセスできません。なぜなら、彼らは私に「無許可」ページへのリダイレクトを返すからです。もちろん、スーパーユーザーでビューにアクセスしようとすると、アプリの通常の動作では発生しません。 –

+0

さて、新しいオブジェクトを作成するときに、ユーザーに 'is_superuser = True'を割り当てるのではなく、より具体的な 'create_superuser'メソッドを使用する方法があります。私はこれを私の問題の有効な解決策として書いていきます。 –

+0

ああ...あなたが正しいです、私は答えを更新しました – Aaron

1

あなたは猿はそれにパッチを当てることができます:

import django.contrib.auth.decorators 

real_permission_required = decorators.permission_required 
# return a function that returns the exact function that was decorated, ignoring arguments 
decorators.permission_required = lambda *args, **kwargs: lambda func: func 

は、あなたはそれは装飾のオブジェクトの定義時である、使用される前、この問題が発生したことを確認する必要があります。 (たとえば、そのモジュールが含まれている場合)

また、別のスコープにリバウンドする前に発生する必要があります。 import django.contrib.auth.decoratorsの後は、しかし、from django.contrib.auth.decorators import permission_requiredの前には問題ありません。

+1

答えていただきありがとうございますが、やや難しいようですが、私は通常フレームワークのネイティブメソッドをオーバーライドしない方が好きです。とにかく、あなたが提案したものをやることは面白いでしょう。 最後に、Client.login()メソッドを使用してユーザーをログに記録し、これを使用してビューにアクセスする方法を解決しました。これはビューと 'login_required'または 'permission_required'デコレータの両方をテストするため、すべてをテストする最良の方法です。 もう一度、ありがとうございます! 乾杯、 Jose –

+0

うん、それは最善の方法のように聞こえる。ソリューションを追加するために質問を編集してみませんか? – agf

+0

is_superuser = Trueで作成されているにもかかわらず、ユーザーがビューにアクセスできないため、今はわかりません。 –

0

まあにおけるスーパーユーザでログインします。私が見つけた解決策は、TestCaseクラスのsetUpメソッドでスーパーユーザーを作成することです。私はそのようにそれをやった:

その後
def setUp(self): 
    self.client = Client() 
    self.user = User.objects.create_superuser(
     'testuser', 
     '[email protected]', 
     'easy_password', 
    ) 

、私はURLをテストしたいとき、私はこれを行う:

def test_search_customers(self): 
    url = reverse('customer_search') 
    response = self.client.get(url) 
    # Not logged user. Must return a 302 HTTP code. 
    self.assertEquals(response.status_code, 302) 
    self.assertEquals(response['Location'], 'http://testserver/unauthorized/?next=/search/customers/') 
    # HERE I LOG IN MY SUPERUSER 
    self.client.login(username='testuser', password='easy_password') 
    response = self.client.get(url, follow=True) 
    # Same URL requested with a logged user with permissions. Must return 200 HTTP code. 
    self.assertEquals(response.status_code, 200) 

これは、それが私のために働いていたものです:)

ありがとうすべて。乾杯、

ホセ

+1

あなたはそれのようにするつもりなら、私は2つのテストに分割するだろう。 1つは許可なしにリダイレクトされていることを確認するものです:self.assertRedirects(レスポンス、 'http:// testserver/unauthorized /?next =/search/customers /'とスーパーユーザーと一緒にログインして、正しいこと。 – Aaron

関連する問題