Back-End

12 abr, 2011

Testando view com requisição AJAX em Django

Publicidade

Quem
já programou usando testes unitários sabe a vantagem deles, guiar o seu
desenvolvimento através de testes pode ser ainda melhor. Entretanto as vezes o
desenvolvedor se encontra numa situação onde ele não sabe como testar o que
quer. E agora, fazer ou não fazer? Esta pode ser uma discussão para outro post
🙂

Isso
já aconteceu comigo várias vezes, uma delas foi quando eu precisei testar uma
view no Django que era chamada via AJAX. Para saber se a requisição foi feita
desta forma na view é bem fácil.

def minha_view_ajax(request):
if request.is_ajax():
# yay, aqui entra o código, muito fácil.

Eu
abri o arquivo de testes do Django e fui criar um teste normalmente. Criei um
objeto da classe Client no método setUp e o utilizei para fazer um requisição
POST.

from django.test.client import Client

class MyTest(TestCase):

def setUp(self):
self.client = Client()


def test_view_ajax(self)
# código aqui

self.client.post("/minha/URL/aqui/", dicionario_com_dados)

# mais código aqui

Rodei
os testes e nada aconteceu, ele não entrava no if request.is_ajax().

O
funcionamento do método is_ajax é bem simples, sua implementação tem apenas uma
linha. Esse método apenas verifica se o cabeçalho HTTP_X_REQUESTED_WITH é igual
a ‘XMLHttpRequest’. Então, para fazer minha requisição no teste entrar no if, eu
preciso definir o HTTP_X_REQUESTED_WITH como ‘XMLHttpRequest’. Para isso, vamos
adicionar um parâmetro à chamada do método post no teste. Ela vai ficar assim:

self.client.post("/minha/URL/aqui/", dicionario_com_dados,
HTTP_X_REQUESTED_WITH='XMLHttpRequest')

Agora
a requisição do teste está correta e é possível testar normalmente sua view, que
espera uma requisição ajax.