开发者

Can I avoid permission_required decorator on Django testing?

I am testing a set of Django applications which make extensive use o开发者_如何学Pythonf the 'permission_required' decorator. This derives in a 302 HTTP response in most of the views that I have.

My question is: there is any way to avoid or deactivate the 'permission_required' in testing, so I can get a 200 response when I call my views, instead of the 302?

Thank you!


Just log in with a superuser in your test case setUp method


from django.test import TestCase
from django.contrib.auth.models import User

class TestThatNeedsLogin(TestCase):
    def setUp(self):
        User.objects.create_superuser(
            'user1',
            'user1@example.com',
            '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)


You could monkey patch it:

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

You need to make sure this happens before it's used, which is at the definition time of the object it's decorating. (For example, when that module is included.)

It also has to happen before it's rebound to another scope. After import django.contrib.auth.decorators is fine, but before from django.contrib.auth.decorators import permission_required.


Well. The solution I have found is to create a superuser in the setUp method from the TestCase class. I did it in that way:

def setUp(self):
    self.client = Client()
    self.user = User.objects.create_superuser(
        'testuser',
        'test@example.com',
        'easy_password',
    )

Then, when I want to test a URL, I do this:

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)

This is what it worked for me :)

Thank you all. Cheers,

Jose

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜