2010-11-09 12 views
5

Background: sto utilizzando il middleware django-multihost (http://effbot.org/zone/django-multihost.htm) per consentire alla mia singola app django di rispondere a nomi host diversi dallo stesso progetto. Il middleware modifica lo ROOT_URLCONF (ad esempio il file urls.py) in base all'intestazione della richiesta HTTP Host:.Test di pagine django con middleware per multihost

Questo funziona benissimo, ma voglio scrivere alcuni semplici test di integrazione che controllano il corretto caricamento delle pagine. Ecco un esempio di un test di base che controlla se la pagina viene caricata /trends e che ha il testo "Tendenze per Oggi" su di esso:

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) 

Il problema è che questa carica sempre utilizzando il ROOT_URLCONF di default, piuttosto che quello della Il middleware invocerebbe. Non importa se inserisco esplicitamente l'hostname nell'URL come in client.get("http://secondarysite/trends").

Come posso eseguire il test sugli altri siti virtuali con il client di prova django? Vorrei invocare il middleware nel test in modo da poter testare quella logica. Ma se ho bisogno di fare qualcosa di hacky come impostare ROOT_URLCONF per la durata dei test, ma non sono sicuro di come farlo.

risposta

11

Utilizzo del client di Django è possibile impostare intestazioni HTTP come questo:

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

Fondamentalmente le funzioni get prendere un dict di argomenti, che userà come intestazioni HTTP. Per aderire ad asciugare, si potrebbe fare qualcosa di simile in setup() della classe unittest:

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

E nel tuo metodo di prova:

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

Nota: Non sono sicuro se questo funzionerà per il tuo problema. Questo è comunque l'unico modo in cui posso pensare di impostare le intestazioni.

Un'altra soluzione mi viene in mente è quello di impostare l'URLConf sulla classe di test, in questo modo:

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

Ciò tuttavia non prova il middleware.

+0

Perfetto. Grazie! – Leopd