Могу ли я избежать разрешения_требованного декоратора при тестировании Django? - PullRequest
1 голос
/ 21 июля 2011

Я тестирую набор приложений Django, которые широко используют декоратор'ree_required '.Это происходит в ответе HTTP 302 в большинстве представлений, которые у меня есть.

Мой вопрос: есть какой-либо способ избежать или деактивировать'mission_required 'в тестировании, поэтому я могу получить ответ 200, когда яНазовите мои взгляды вместо 302?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 21 июля 2011

Просто войдите с суперпользователем в ваш метод настройки теста


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)
1 голос
/ 21 июля 2011

Вы можете залатать это обезьяной:

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.

0 голосов
/ 21 июля 2011

Хорошо. Решение, которое я нашел, заключается в создании суперпользователя в методе setUp из класса TestCase. Я сделал это так:

def setUp(self):
    self.client = Client()
    self.user = User.objects.create_superuser(
        'testuser',
        'test@example.com',
        '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)

Вот что у меня сработало:)

Спасибо всем. Cheers,

Jose

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...