Testes unitários nas views do Django usando @login_required

Esses dias precisei fazer alguns testes unitários nas actions das views da minha aplicação Django, para basicamente verificar se a sua requisição foi feito com sucesso, e se está usando o template correto. Só que isso é simples quando suas views não usam o decorator @login_required.

Nesse post ensina você a fazer os testes necessários quando as suas actions necessitam de uma autenticação do usuário.

1. Criando fixtures

Um dos procedimentos principais para que consiga executar os seus testes com sucesso, é criar fixtures que contenham dados de um usuário fictício. Caso possua usuários que fez para teste no seu banco de desenvolvimento, vai ser muito importante porque vamos fazer um dump dessas informações e jogar em um arquivo JSON. Digite o seguinte comando:

$ python manage.py dumpdata auth.User --indent 4 > users.json

Agora temos um arquivo chamado user.json para ser usado na classe de teste. Insira esse arquivo na pasta fixtures da sua aplicação:

$ mv users.json apps/clients/fixtures

Então vamos criar uma classe no arquivo* tests.py* da sua aplicação e testarmos uma action fictícia:

    # -*- coding: utf8 -*-

    from django.test import TestCase
    from django.core.urlresolvers import reverse

    class ClientViewTest(TestCase):
        """Unit test for client views"""

        fixtures = ['users.json']

        def setUp(self):
            self.response = self.client.login(username='john', password='123456')

        def test_profile_success(self):
            self.response = self.client.get(reverse('clientes:profile'))
            self.assertTrue(200, self.response.status_code)
            self.assertTemplateUsed(self.response, 'clients/profile_form.html')

Quando for executar o teste, vai perceber que vai funcionar porque a variável response já vai receber o contexto do usuário que foi logado e assim ele terá a autorização de acessar/verificar o funcionamento das actions testadas.

Então é isso. Até mais ;)