私は 'permission_required'デコレータを幅広く使用する一連のDjangoアプリケーションをテストしています。これは私が持っているほとんどのビューの302 HTTP応答に由来します。Djangoのテストでpermission_requiredデコレータを使用することはできますか?
私の質問は、テストで 'permission_required'を回避または無効にする方法があるため、302の代わりにビューを呼び出すと200の応答が得られますか?
ありがとうございました!
私は 'permission_required'デコレータを幅広く使用する一連のDjangoアプリケーションをテストしています。これは私が持っているほとんどのビューの302 HTTP応答に由来します。Djangoのテストでpermission_requiredデコレータを使用することはできますか?
私の質問は、テストで 'permission_required'を回避または無効にする方法があるため、302の代わりにビューを呼び出すと200の応答が得られますか?
ありがとうございました!
ちょうどあなたのテストケースの設定方法
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)
あなたは猿はそれにパッチを当てることができます:
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
の前には問題ありません。
答えていただきありがとうございますが、やや難しいようですが、私は通常フレームワークのネイティブメソッドをオーバーライドしない方が好きです。とにかく、あなたが提案したものをやることは面白いでしょう。 最後に、Client.login()メソッドを使用してユーザーをログに記録し、これを使用してビューにアクセスする方法を解決しました。これはビューと 'login_required'または 'permission_required'デコレータの両方をテストするため、すべてをテストする最良の方法です。 もう一度、ありがとうございます! 乾杯、 Jose –
うん、それは最善の方法のように聞こえる。ソリューションを追加するために質問を編集してみませんか? – agf
is_superuser = Trueで作成されているにもかかわらず、ユーザーがビューにアクセスできないため、今はわかりません。 –
まあにおけるスーパーユーザでログインします。私が見つけた解決策は、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)
これは、それが私のために働いていたものです:)
ありがとうすべて。乾杯、
ホセ
あなたはそれのようにするつもりなら、私は2つのテストに分割するだろう。 1つは許可なしにリダイレクトされていることを確認するものです:self.assertRedirects(レスポンス、 'http:// testserver/unauthorized /?next =/search/customers /'とスーパーユーザーと一緒にログインして、正しいこと。 – Aaron
ありがとうございます。はい、私はあなたの言う通りにテストユーザーを作成しましたが、 'is_superuser'パラメーターが私のために働いていないようです。私はビューにアクセスできません。なぜなら、彼らは私に「無許可」ページへのリダイレクトを返すからです。もちろん、スーパーユーザーでビューにアクセスしようとすると、アプリの通常の動作では発生しません。 –
さて、新しいオブジェクトを作成するときに、ユーザーに 'is_superuser = True'を割り当てるのではなく、より具体的な 'create_superuser'メソッドを使用する方法があります。私はこれを私の問題の有効な解決策として書いていきます。 –
ああ...あなたが正しいです、私は答えを更新しました – Aaron