8

I am new to unit testing so I have no idea what I am doing wrong. I use python2.7 with Django1.8

When I run

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 fine so I suppose the error is in the test. If you need any other code I'll paste it here.

1 Answer 1

20

The HTTP_HOST header is not set by the Django test client by default. Your multihost middleware assumes that the header is always present, so you get a KeyError when the tests run.

You may want to change your multihostname middleware so that it doesn't cause an error when the header is not in the request.

if 'HTTP_HOST' in request.META:
    host = request.META['HTTP_HOST'].split(':')[0]
    ...
else:
    # do something else

Or maybe have a default host:

host = request.META.get('HTTP_HOST', 'defaulthost.com').split(':')[0]

If you want to test the effect of different headers, you can include the header when you make a request:

client = Client()
# Make a request, setting the header manually
client.get('/my_url', HTTP_HOST='example.com')

Or you can set up the test client to include a header in all requests:

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

See the docs on making requests for more info.

Sign up to request clarification or add additional context in comments.

3 Comments

do you know how can I fix this on Flask?
@SibeliusSeraphini This question is Django specific, please ask a different question, and give full details of your problem.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.