Testování AJAX views s dajaxice

Django samo o sobě nabízí integrovaného HTTP klienta pro testy a testování views je docela snadné. Komplikace nastávají, pokud views jsou AJAXové, ale o tom lze pár informací na webu najít. Nicméně na specifika, která přináší dvojice dajax a dajaxice, strýček google už moc nenapovídá, tak nezbývá než laborovat. Ale, povedlo se :-)

TestCase v djangu má objekt client, který se používá pro testování. Například pro POST požadavek lze v test proceduře zavolat:

  1. self.client.post(URL, DATA)

(do DATA se cpou data POST požadavku jako slovník. Tohle funguje na normální views, na AJAXová je potřeba ještě mírně modifikovat HTTP hlavičky. To lze provést přidáním dalšího argumentu. Modifikace stávajícího řešení pak vypadá takto:

  1. self.client.post(URL, DATA, HTTP_X_REQUESTED_WITH='XMLHttpRequest'))

To k samotnému testování AJAX views. V kombinaci s dajaxice je třeba dořešit ještě dvě věci. Prvním objektem zájmu je URL adresa, jelikož při psaní view se o ní až tak nezajímáte. URL adresa view má dvě části. V první je to, co je v settings nasteveno v DAJAXICE_MEDIA_PREFIX a v druhé python cesta k view (ovšem s vynecháním package ajax). Příklad: máte projekt mujprojekt, v něm django aplikace mojeapp, v ní v souboru ajax je view mojeajaxview a v settings.py pro DAJAXICE_MEDIA_PREFIX je nastaveno dajaxice. Výsledná URL adresa pro tohle view bude: /dajaxice/mujprojekt.mojeapp.mojeajaxview/. Aby vše bylo korektní, měla by se pro sestavení URL adresy použít hodnota v nastavení. Cesta ke view by jinak už měla být daná. Také doporučuji nezapomenout na lomítko na konci - pokud tam chybí, tak nedojde ke spuštění view. Jenom se vrátí redirect s informací, že máte přejít na tu zadanou adresu s lomítkem na konci (a test client redirect automaticky neprovede).

Poslední část co ještě zbývá, jsou views s parametry. Kdyby výše zmíněné mojeajaxview přebíralo ještě param1 a param2 jako argumenty, budete je při testu nejspíše chtít předat. Jak je naznačeno výše, POST požadavku můžete velice snadno předat data. Nicméně předat do této části něco takového:

  1. {'param1': 'hodnota1', 'param2': 'hodnota2'}

také nefunguje. Pokud zkusíte view v prohlížeči, zjistíte, že v POST požadavku se předává jenom parametr argv a v něm je serializovaný slovník. S použitím python modulu json by hodnota pro DATA vypadala takto:

  1. {'argv': json.dumps({'param1': 'hodnota1', 'param2': 'hodnota2'})}

Na závěr ještě rekapitulace. Zavolání zmíněného view z test clienta s těmito dvěma hodnotami by vypadalo takto:

  1. self.client.post(settings.DAJAXICE_MEDIA_PREFIX+'/mujprojekt.mojeapp.mojeajaxview/', {'argv': json.dumps({'param1': 'hodnota1', 'param2': 'hodnota2'})}, HTTP_X_REQUESTED_WITH='XMLHttpRequest'))