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/')

См. Документы о создании запросов для получения дополнительной информации.

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