KeyError: 'HTTP_HOST' при запуске тестов django
Я новичок в модульном тестировании, поэтому я понятия не имею, что я делаю неправильно. Я использую Python2.7 с Django1.8
Когда я бегу
python manage.py test myapp --keepdb
я получил
======================================================================
ERROR: test_view_content (myproject.news.tests.test_views.EntryTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/zoli/projects/project_dict/myproject/news/tests/test_views.py", line 27, in test_view_content
response = client.get(reverse('news_list', kwargs={'page': 1}))
File "/home/zoli/.virtualenvs/project_dict/local/lib/python2.7/site-packages/django/test/client.py", line 500, in get
**extra)
File "/home/zoli/.virtualenvs/project_dict/local/lib/python2.7/site-packages/django/test/client.py", line 303, in get
return self.generic('GET', path, secure=secure, **r)
File "/home/zoli/.virtualenvs/project_dict/local/lib/python2.7/site-packages/django/test/client.py", line 379, in generic
return self.request(**r)
File "/home/zoli/.virtualenvs/project_dict/local/lib/python2.7/site-packages/django/test/client.py", line 466, in request
six.reraise(*exc_info)
File "/home/zoli/.virtualenvs/project_dict/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 108, in get_response
response = middleware_method(request)
File "/home/zoli/projects/project_dict/myproject/middleware/multihostname.py", line 18, in process_request
host = request.META['HTTP_HOST'].split(':')[0]
KeyError: u'HTTP_HOST'
----------------------------------------------------------------------
Мои тесты выглядят как
from django.test import TestCase, Client
from django.contrib.sites.models import Site
from myproject.news.models import Entry
from myproject.people.models import User
from django.core.urlresolvers import reverse
class EntryTestCase(TestCase):
def setUp(self):
user1 = User.objects.create(username='zoli')
site1 = Site.objects.create(domain='mysite.sk', name='mysite')
entry = Entry(author=user1, title='Titulok', text='Toto je obsah')
entry.save()
entry.sites.add(site1)
entry.save()
def test_view_content(self):
client = Client()
response = client.get(reverse('news_list', kwargs={'page': 1})) # This is raising and error
print response.content
Когда я захожу в / novinky/strana/1/ все идет хорошо, так что я полагаю, что ошибка в тесте. Если вам нужен какой-то другой код, я вставлю его сюда.
1 ответ
HTTP_HOST
заголовок не устанавливается тестовым клиентом Django по умолчанию. Ваше промежуточное промежуточное ПО предполагает, что заголовок всегда присутствует, поэтому вы получаете KeyError
когда тесты запускаются.
Возможно, вы захотите изменить свое промежуточное ПО с несколькими именами, чтобы оно не вызывало ошибку, когда заголовок отсутствует в запросе.
if 'HTTP_HOST' in request.META:
host = request.META['HTTP_HOST'].split(':')[0]
...
else:
# do something else
Или может иметь хост по умолчанию:
host = request.META.get('HTTP_HOST', 'defaulthost.com').split(':')[0]
Если вы хотите проверить влияние различных заголовков, вы можете включить заголовок при выполнении запроса:
client = Client()
# Make a request, setting the header manually
client.get('/my_url', HTTP_HOST='example.com')
Или вы можете настроить тестовый клиент на включение заголовка во все запросы:
client = Client(HTTP_HOST='example.com')
# The header will be set for both of the following requests
client.get('/my_url/')
client.get('/my_second_url/')
См. Документы о создании запросов для получения дополнительной информации.