Leo*_*opd 5 django unit-testing django-middleware
背景:我正在使用中间件django-multihost(http://effbot.org/zone/django-multihost.htm)来允许我的单个django应用程序响应来自同一项目的不同主机名.中间件根据HTTP请求标头更改ROOT_URLCONF(即哪个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 )
Run Code Online (Sandbox Code Playgroud)
问题是,这总是使用默认的ROOT_URLCONF而不是中间件调用的ROOT_URLCONF加载.如果我明确地将主机名放入url中并不重要client.get("http://secondarysite/trends").
如何使用django测试客户端在其他虚拟站点上进行测试?我想在测试中调用中间件,这样我就可以测试那个逻辑.但是,如果我需要做一些hacky,比如在测试期间设置ROOT_URLCONF,但我不知道该怎么做.
knu*_*tin 11
使用Django客户端,您可以设置HTTP标头,如下所示:
client.get(url, HTTP_HOST = 'my.host.com')
Run Code Online (Sandbox Code Playgroud)
基本上这些get函数采用参数的dict,它将用作HTTP头.要坚持DRY,你可以setup()在unittest类中做这样的事情:
self.request_headers = { 'HTTP_HOST': 'foo' }
Run Code Online (Sandbox Code Playgroud)
在你的测试方法中:
client.get(url, **self.request_headers)
Run Code Online (Sandbox Code Playgroud)
注意:我不确定这是否适用于您的问题.然而,这是我能设想标头的唯一方法.
我能想到的另一个解决方案是在测试类上设置URLConf,如下所示:
class Mytest(TestCase):
urls = 'my.urlconf'
Run Code Online (Sandbox Code Playgroud)
但是,这不会测试中间件.
| 归档时间: |
|
| 查看次数: |
1833 次 |
| 最近记录: |