Обнаружение ошибок разрешения в тестах Django - PullRequest
5 голосов
/ 14 апреля 2010

Я пишу подробные функциональные тесты для моих представлений в дополнение к модульным тестам на моих моделях. Это проект Django, и я использую встроенную тестовую среду Django с unittest. Очевидно, что одна из важных вещей, которую необходимо проверить в этих функциональных тестах, заключается в том, что разрешения настроены правильно. Имея это в виду, я пытаюсь что-то вроде этого:

anonclient = Client()
userclient = Client()
userclient.login(username='test_user', password='test')
adminclient = Client()
adminclient.login(username='test_admin', password='test')

path = "/path/to/my/page"
anonresponse = anonclient.get(path)
userresponse = userclient.get(path)
adminresponse = adminclient.get(path)

Мне нужно иметь возможность подтвердить, что анконклиенту и пользовательскому клиенту было отказано в разрешении, в то время как админклиент работал правильно. Однако я не могу найти способ проверить, что это произошло надежно !

Сначала я решил проверить, что ответ был перенаправлением 302 (потому что побочный эффект от неудачной проверки разрешений перенаправляется), но это означает, что невозможно определить разницу между функциональностью, которая автоматически перенаправляет пользователя и неудачным проверка разрешений. (Я не могу просто использовать self.assertRedirects (response, url), потому что целевой URL может быть переопределен через параметр login_url декоратораree_required в представлении!)

Возможно, мне следует изучить расширение декоратора user_passes_test, чтобы оно добавляло свойство к объекту ответа в случае сбоя теста? Это может быть проверено в тестах. В противном случае мне нужно будет определить, был ли запрос успешным, проверив, имели ли место побочные эффекты запроса. Делать это таким образом будет работать, но это будет чрезвычайно затянуто, особенно с учетом того, что многие проверки выполняются.

Не могу себе представить, что я первый, кто столкнулся с этой проблемой, как правильно решить эту проблему или что я пропустил?

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 01 августа 2016

Декоратор access_required и PermissionRequiredMixin имеют параметр raise_exception.

Один из возможных способов справиться с этим - иметь в конфигурации settings_test.py что-то вроде параметра конфигурации PERMISSIONS_RAISE_EXCEPTION=True (если вы используете отдельные настройки для тестовых прогонов и у вас есть

from django.conf import settings

@permission_required('<perm>',
                     raise_exception=settings.PERMISSIONS_RAISE_EXCEPTION)
def your_view(...)
    pass

class YourView(PermissionRequired):
    raise_exception = settings.PERMISSIONS_RAISE_EXCEPTION

Таким образом, вы можете поймать исключение / тест для 403 в ваших тестах и ​​сохранить перенаправление на страницу входа.

client.login('user', 'blah')
response = client.get('/yourview')
assertNot(403, response.status_code)

Добавление настроек ко всем вашим permission_required декораторам может не соответствовать вашему вкусу, это похоже на добавление тестового кода в исходный код, но это единственный способ, который я видел до сих пор.

1 голос
/ 14 апреля 2010

Тестовый клиент django возвращает логическое значение при вызове метода входа в систему, который сообщает вам, был ли вход успешным.

[17] >>> from django.test import Client
[18] >>> c = Client()
[19] >>> c.login(username='superuser', password='bar')
[19] : False
[20] >>> c.login(username='superuser', password='correct_password')
[20] : True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...