Reputation: 836
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.
Upvotes: 8
Views: 7017
Reputation: 309089
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.
Upvotes: 20