Обезьяна исправила логин 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 тесты для их замены.

Другие вопросы по тегам