KeyError: "HTTP_HOST" when running django tests

I'm new to unit testing, so I have no idea what I'm doing wrong. I am using python2.7 with Django1.8

When i started

python manage.py test myapp --keepdb

I get

======================================================================
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'

----------------------------------------------------------------------

My tests look like

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

When I visit / novinky / strana / 1 / everything goes well, so I assume the error is in the test. If you need any other code, I paste it here.

+4
source share
1 answer

The HTTP_HOSTdefault header is not set by the Django Test Client. Your middleware middleware assumes the header is always present, so when you run the tests you get KeyError.

, multihostname, , .

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

. .

+10

Source: https://habr.com/ru/post/1624958/


All Articles