2011-07-21 117 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