【问题标题】:Testing django pages with middleware for multihost使用多主机中间件测试 django 页面
【发布时间】:2010-11-09 19:13:22
【问题描述】:

背景:我正在使用中间件django-multihost (http://effbot.org/zone/django-multihost.htm) 允许我的单个 django 应用程序响应来自同一项目的不同主机名。中间件根据Host: HTTP 请求标头更改ROOT_URLCONF(即哪个urls.py 文件)。

这很好用,但我想编写一些简单的集成测试来检查页面是否正确加载。下面是一个基本测试示例,它检查 /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 加载,而不是中间件调用的那个。如果我像client.get("http://secondarysite/trends") 那样将主机名显式放入网址中也没关系。

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

【问题讨论】:

    标签: django unit-testing django-middleware


    【解决方案1】:

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

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

    基本上,get 函数采用参数字典,它将用作 HTTP 标头。要遵守 DRY,您可以在 unittest 类的 setup() 中执行以下操作:

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

    在你的测试方法中:

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

    注意:我不确定这是否能解决您的问题。然而,这是我能想到的设置标题的唯一方法。

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

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

    但这不会测试中间件。

    【讨论】:

      【解决方案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 标头。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多