2010-11-09 20 views
5

背景:我正在使用中間件django-multihost(http://effbot.org/zone/django-multihost.htm)來允許我的單個django應用程序響應來自相同主機名的不同主機名項目。中間件根據Host: HTTP請求標頭更改ROOT_URLCONF(即哪個urls.py文件)。用多媒體中間件測試django頁面

這很好,但我想寫一些簡單的集成測試,檢查頁面加載正確。這裏有一個基本的測試,檢查的一個例子,如果/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,而不是一箇中間件會調用。如果我明確地將主機名放入url中,則無關緊要,如client.get("http://secondarysite/trends")

如何使用django測試客戶端測試其他虛擬站點?我想在測試中調用中間件,以便測試該邏輯。但是如果我需要在測試期間做一些像設置ROOT_URLCONF這樣的操作,但我不知道該怎麼做。

回答

11

使用Django的客戶端可以設置HTTP標頭是這樣的:

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

基本上get函數需要的參數,它將作爲HTTP頭使用的字典。要堅持幹,你可以做這樣的事情在單元測試類的setup()

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

並在測試方法:

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

注:我不知道這是否會爲工作你的問題。然而,這是我能想到設置標題的唯一方法。

我能想到的另一個解決方案是設置URL配置你的測試類,像這樣:

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

這可是不考中間件。

+0

完美。謝謝! – Leopd 2010-11-09 20:38:15