Тестирование страниц django с промежуточным ПО для multihost - PullRequest
5 голосов
/ 09 ноября 2010

Справочная информация: я использую промежуточное программное обеспечение django-multihost (http://effbot.org/zone/django-multihost.htm), чтобы разрешить моему одиночному приложению django отвечать на разные имена хостов из одного проекта. Промежуточное программное обеспечение изменяет ROOT_URLCONF (т.е. файл urls.py) в заголовке HTTP-запроса Host:.

Это прекрасно работает, но я хочу написать несколько простых интеграционных тестов, которые проверяют правильность загрузки страниц. Вот пример базового теста, который проверяет, загружается ли страница /trends и имеет ли он текст «Тенденции на сегодня»:

def test_homepage_loads(self):
    client = Client()
    client.login(username = 'testing', password = 'testing')
    page = client.get("/trends", follow = follow_redirects)
    self.assertEquals(page.status_code, 200)
    self.assertTrue( page.content.find('Trends for Today') > 0 )

Проблема в том, что при загрузке всегда используется ROOT_URLCONF по умолчанию, а не тот, который будет вызывать Middleware. Не имеет значения, если я явно введу имя хоста в URL, как в client.get("http://secondarysite/trends").

Как я могу тестировать на других виртуальных сайтах с помощью тестового клиента django? Я хотел бы вызвать промежуточное программное обеспечение в тесте, чтобы я мог проверить эту логику. Но если мне нужно, я бы сделал что-то хакерское, например, установил ROOT_URLCONF на время тестов, но я не уверен, как это сделать.

Ответы [ 2 ]

11 голосов
/ 09 ноября 2010

Используя Django Client, вы можете установить HTTP-заголовки следующим образом:

client.get(url, HTTP_HOST = 'my.host.com')

В основном функции get принимают набор аргументов, которые он будет использовать в качестве HTTP-заголовков.Чтобы придерживаться DRY, вы можете сделать что-то вроде этого в setup() класса unittest:

self.request_headers = { 'HTTP_HOST': 'foo' }

И в вашем методе тестирования:

client.get(url, **self.request_headers)

Примечание: я неуверен, если это будет работать для вашей проблемы.Тем не менее, это единственный способ установить заголовки.

Другое решение, о котором я могу подумать, это установить URLConf для вашего тестового класса, например:

class Mytest(TestCase):
    urls = 'my.urlconf'

ЭтоОднако не будет тестировать промежуточное программное обеспечение.

2 голосов
/ 09 ноября 2010

http://docs.djangoproject.com/en/dev/topics/testing/#django.test.client.Client.get:

The extra keyword arguments parameter can be used to specify headers to be sent in the request

Итак, вы можете попробовать переопределить заголовок HTTP_HOST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...