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.