2011-07-21 32 views
1

我正在測試一系列廣泛使用'permission_required'裝飾器的Django應用程序。這在我擁有的大多數視圖中以302 HTTP響應派生。Django測試可以避免permission_required裝飾器嗎?

我的問題是:有什麼辦法可以避免或停用測試中的'permission_required',所以當我打電話給我的意見時,我可以得到200響應,而不是302?

謝謝!

回答

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'裝飾器。 再次,謝謝! 乾杯, 何塞 –

+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

如果你要這樣做,我會把它分成兩個測試。一個確保他們未經許可重定向:self.assertRedirects(響應,'http:// testserver /未授權/?下一步= /搜索/ customers /'和旁邊用你的超級用戶登錄,並確保它做正確的事。 – Aaron