Django - Testes unitários com views usando @login_required

Posted by Gilson Filho on ter 27 março 2012

Olá pessoal,

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:

``` python test_views.py # -- 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 ;)

tags:


Comments !