Миграция Django 2.0 нарушает модульный тест django-autocomplete-light с TypeError
Я пытаюсь перейти на Django 2.0 с 1.11, но некоторые модульные тесты, связанные с django-autocomplete-light (3.5.1), начали завершаться с TypeError после вызова self.client.get() из класса TestCase. (__init__() takes 1 positional argument but 2 were given)
В некоторых найденных мною предложениях говорилось, что проблема может заключаться в отсутствии переменной as_view() в представлении URL, но она там уже есть. Я также изменил переменную MIDDLEWARE_CLASSES на MIDDLEWARE в настройках.
test.py
from django.urls import reverse
from django.test import TestCase
from django.contrib.auth.models import User
class AutocompleteTestCase(TestCase):
def setUp(self):
self.admin_cred = {
'username': 'test',
'password': 'test',
}
self.user = User.objects.create_superuser('test', 'test@test.com', self.admin_cred['password'])
def query_autocomplete_view(self, url_name, query=None):
data = {}
if query:
data['q'] = query
self.client.force_login(self.user)
response_json = self.client.get(reverse(url_name), data=data).json()
return response_json.get('results')
Ошибка Traceback
Traceback (most recent call last):
File "/home/circleci/project/test/apps/dataadmin/tests/test_autocomplete_views.py", line 131, in test_dataadmin_field_autocomplete
results = self.query_autocomplete_view('admin:dataadmin_autocomplete_dataadminfield', query='test')
File "/home/circleci/project/dataadmin/common/test_utils.py", line 23, in query_autocomplete_view
response_json = self.client.get(reverse(url_name), data=data).json()
File "/home/circleci/project/venv/lib/python3.6/site-packages/django/test/client.py", line 517, in get
response = super().get(path, data=data, secure=secure, **extra)
File "/home/circleci/project/venv/lib/python3.6/site-packages/django/test/client.py", line 332, in get
return self.generic('GET', path, secure=secure, **r)
File "/home/circleci/project/venv/lib/python3.6/site-packages/django/test/client.py", line 404, in generic
return self.request(**r)
File "/home/circleci/project/venv/lib/python3.6/site-packages/django/test/client.py", line 467, in request
response = self.handler(environ)
File "/home/circleci/project/venv/lib/python3.6/site-packages/django/test/client.py", line 125, in __call__
self.load_middleware()
File "/home/circleci/project/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 39, in load_middleware
mw_instance = middleware(handler)
TypeError: __init__() takes 1 positional argument but 2 were given
Похоже, что ошибка возникает после загрузки промежуточного ПО, но я не смог определить никаких проблем с установкой промежуточного ПО.
settings.py
MIDDLEWARE = (
'django_prometheus.middleware.PrometheusBeforeMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'allow_cidr.middleware.AllowCIDRMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django_auditor.middleware.AuditorMiddleware',
'django_prometheus.middleware.PrometheusAfterMiddleware',
)
AdminApp использует django.contrib.admin.AdminSite. Она настраивает базовое приложение администратора. Функция возвращает список шаблонов URL.
admin.py
class DataAdminApp(AdminApp):
def get_urls(self):
return [
url(
r'^dataadmin/autocomplete/dataadminfield/$',
self.admin_view(DataAdminFieldAutocomplete.as_view()),
name="dataadmin_autocomplete_dataadminfield"
)
]