Обезьяна исправила логин Django Auth, теперь его тесты не пройдены - PullRequest
3 голосов
/ 30 марта 2011

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

URL:

#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.

Только эти два теста не выполняются с включением обернутой обезьяны для входаpatch.
Кажется, что вызов reverse () в тесте проверки подлинности django ведет себя иначе, чем непатченная функция.Новые сигналы аутентификации в django 1.3 заключаются в том, что предоставленный там метод регистрации сообщает вам только о том, что произошла неправильная попытка - он не дает вам доступ к объекту запроса для регистрации дополнительной информации об этомпо запросу.Исправление формы аутентификации в этом случае не помогло бы, поэтому мы должны обернуть функцию входа в систему.

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

edit: я использую python 2.6.4, django 1.2.5

Ответы [ 2 ]

5 голосов
/ 07 мая 2011

Не могли бы вы просто обернуть его в другой вид?

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 будет тестировать представление, для которого они были написаны, и вы можете написать свои собственные тесты для "большего количества материала", который вам нужен.

3 голосов
/ 06 мая 2011

Я подозреваю, что это та же самая основная проблема , которая влияет на регистрацию django в том, что исполнитель теста импортирует только URL-адреса тестируемого приложения в то время - то есть contrib.auth, а не myapp Есть различных билетов о вещах похожих на эту проблему , но быстрое сканирование их подразумевает, что решение состоит в том, чтобы отделить вещи, которые не будутЯ полагаю, что это подходит для вашего решения.

Другим способом было бы использовать файл Fabric или Makefile для запуска подмножества тестов, избегая двух неудачных из-за вашего monkeypatch, а затем добавив два альтернативных apeдружественные тесты, чтобы заменить их.

...