2016-01-19 7 views
4

Я новичок в модульном тестировании, поэтому я понятия не имею, что я делаю неправильно. Я использую python2.7 с Django1.8KeyError: «HTTP_HOST» при запуске тестов django

Когда я бегу

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/СТРАНА/1/все идет хорошо, поэтому я предполагаю, что ошибка находится в тесте. Если вам нужен какой-либо другой код, я буду вставлять его здесь.

ответ

10

Заголовок HTTP_HOST по умолчанию не установлен тестовым клиентом Django. Ваше межконтентное промежуточное ПО предполагает, что заголовок всегда присутствует, поэтому при выполнении тестов вы получаете 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/') 

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

+0

Знаете ли вы, как я могу исправить это на колбе? –

+0

@SibeliusSeraphini Этот вопрос задан Django, задайте другой вопрос и дайте полную информацию о своей проблеме. – Alasdair

+0

спасибо, это мой вопрос для фляжки: http://stackoverflow.com/questions/36358254/http-host-keyerror-flask –