使用中间件测试django页面的多主机

时间:2010-11-09 19:13:22

标签: django unit-testing django-middleware

背景:我正在使用中间件django-multihost(http://effbot.org/zone/django-multihost.htm)来允许我的单个django应用程序响应来自同一项目的不同主机名。中间件根据ROOT_URLCONF HTTP请求标头更改urls.py(即哪个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而不是中间件调用的ROOT_URLCONF加载。如果我在client.get("http://secondarysite/trends")中明确地将主机名放入网址中,则无关紧要。

如何使用django测试客户端在其他虚拟站点上进行测试?我想在测试中调用中间件,这样我就可以测试那个逻辑。但是,如果我需要做一些hacky,比如在测试期间设置ROOT_URLCONF,但我不知道该怎么做。

2 个答案:

答案 0 :(得分:11)

使用Django Client,您可以像这样设置HTTP标头:

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

基本上get函数采用参数的dict,它将用作HTTP头。要坚持DRY,你可以在unittest类的setup()中做这样的事情:

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

在你的测试方法中:

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

注意:我不确定这是否适用于您的问题。然而,这是我设想标题的唯一方法。

我能想到的另一个解决方案是在测试类上设置URLConf,如下所示:

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

然而,这不会测试中间件。

答案 1 :(得分:2)

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标头。