我正在測試一系列廣泛使用'permission_required'裝飾器的Django應用程序。這在我擁有的大多數視圖中以302 HTTP響應派生。Django測試可以避免permission_required裝飾器嗎?
我的問題是:有什麼辦法可以避免或停用測試中的'permission_required',所以當我打電話給我的意見時,我可以得到200響應,而不是302?
謝謝!
我正在測試一系列廣泛使用'permission_required'裝飾器的Django應用程序。這在我擁有的大多數視圖中以302 HTTP響應派生。Django測試可以避免permission_required裝飾器嗎?
我的問題是:有什麼辦法可以避免或停用測試中的'permission_required',所以當我打電話給我的意見時,我可以得到200響應,而不是302?
謝謝!
具有超級用戶只需登錄你的測試案例設置方法
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'裝飾器。 再次,謝謝! 乾杯, 何塞 –
是的,這聽起來像是最好的方法。爲什麼不編輯你的問題來添加解決方案? – 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)
這是它爲我工作:)
謝謝所有。乾杯,
何塞
如果你要這樣做,我會把它分成兩個測試。一個確保他們未經許可重定向:self.assertRedirects(響應,'http:// testserver /未授權/?下一步= /搜索/ customers /'和旁邊用你的超級用戶登錄,並確保它做正確的事。 – Aaron
謝謝。是的,我已經完全按照你說的方式創建了一個測試用戶,但是看起來'is_superuser'參數不適合我。我無法訪問這些視圖,因爲他們正在將我重定向到'未授權'頁面。當然,當我嘗試以超級用戶訪問視圖時,這在應用程序的正常行爲中不會發生。 –
好的,不是在創建新對象時爲用戶分配'is_superuser = True',而是使用更具體的'create_superuser'方法。我會寫這個作爲我的問題的有效解決方案。 –
啊..你說得對,我已經更新了答案 – Aaron