我正在测试一系列广泛使用'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