Обезьяна исправила логин Django Auth, теперь его тесты не пройдены
Мое приложение стремится обернуть представления входа и выхода из django.contrib.auth.views некоторыми базовыми возможностями аудита / ведения журнала. Я следую рецепту, как описано в проекте django-axes, и при запуске на сервере и некоторых других тестах он работает, как и ожидалось, прозрачно, без проблем.
Код выглядит так:
from django.contrib.auth import views as auth_views
from myapp.watchers import watch_login
class WatcherMiddleware(object):
def __init__(self):
auth_views.login = watch_login(auth_views.login)
А также
def watch_login(func):
def decorated_login(request, *args, **kwargs):
#do some stuff
response = func(request, *args, **kwargs)
#more stuff
return response
return decorated_login
Urls:
#Edit: Added project's urls - just using vanilla django's auth login
(r'^accounts/login/$', 'django.contrib.auth.views.login',{"template_name":settings.LOGIN_TEMPLATE }),
Однако в нашем рабочем процессе сборки мы сталкиваемся с некоторыми проблемами в django.contrib.auth.tests.views.
В частности, это тесты, которые не выполняются в django.contrib.auth:
ERROR: test_current_site_in_context_after_login (django.contrib.auth.tests.views.LoginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python26\lib\site-packages\django\contrib\auth\tests\views.py", line 192, in test_current_site_in_context_after_login
response = self.client.get(reverse('django.contrib.auth.views.login'))
File "C:\Python26\lib\site-packages\django\core\urlresolvers.py", line 351, in reverse
*args, **kwargs)))
File "C:\Python26\lib\site-packages\django\core\urlresolvers.py", line 297, in reverse
"arguments '%s' not found." % (lookup_view_s, args, kwargs))
NoReverseMatch: Reverse for 'myapp.watchers.decorated_login' with arguments '()' and keyword arguments '{}' not found.
======================================================================
ERROR: test_security_check (django.contrib.auth.tests.views.LoginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python26\lib\site-packages\django\contrib\auth\tests\views.py", line 204, in test_security_check
login_url = reverse('django.contrib.auth.views.login')
File "C:\Python26\lib\site-packages\django\core\urlresolvers.py", line 351, in reverse
*args, **kwargs)))
File "C:\Python26\lib\site-packages\django\core\urlresolvers.py", line 297, in reverse
"arguments '%s' not found." % (lookup_view_s, args, kwargs))
NoReverseMatch: Reverse for 'myapp.watchers.decorated_login' with arguments '()' and keyword arguments '{}' not found.
Только эти два теста завершаются неудачно с включением обернутого патча обезьяны для входа.
Кажется, что вызов reverse() в тесте аутентификации django ведет себя иначе, чем непатченная функция.
Причина, по которой мы идем по этому пути для оборачивания ведения журнала и использования новых сигналов аутентификации django 1.3, заключается в том, что предоставленный там метод ведения журнала сообщает только о том, что произошла неправильная попытка - он не дает вам доступ к объекту запроса для регистрируйте дополнительную информацию вокруг этого неправильного запроса. Исправление формы аутентификации в этом случае не помогло бы, поэтому мы должны обернуть функцию входа в систему.
Я делаю что-то не так с переносом функции входа? Или этого можно ожидать, если тесты не пройдут из-за других побочных эффектов, несмотря на отсутствие изменений в общей функциональности?
редактировать: я использую Python 2.6.4, Django 1.2.5
2 ответа
Не могли бы вы просто обернуть это в другой вид?
urls
:
url(
r'^accounts/login/$',
'accounts.views.login',
{"template_name":settings.LOGIN_TEMPLATE }
),
accounts.views
:
from django.contrib.auth import views as auth_views
def login(request, *args, **kwars):
# do some stuff
response = auth_views.login(request, *args, **kwars)
# more stuff
return response
Как это, django.contrib.auth.tests
Вы будете тестировать представление, для которого они были написаны, и вы можете написать свои собственные тесты для "большего количества материала", который вам нужен.
Я подозреваю, что это та же самая основная проблема, которая затрагивает django-регистрацию в том, что бегущий тест импортирует только URL-адреса тестируемого приложения в то время - т.е. contrib.auth
и не myapp
Существуют различные предложения о вещах, похожих на эту проблему, но быстрое сканирование их подразумевает, что решение состоит в том, чтобы отделить вещи, что, вероятно, не будет жизнеспособным для вашего решения.
Другой способ - использовать Fabric-файл или Makefile для запуска поднабора тестов, избегая двух неудачных тестов из-за вашего monkeypatch, а затем добавить два альтернативных ape-friendly тесты для их замены.