Como devo escrever testes para formulários no Django?


110

Eu gostaria de simular solicitações para minhas visualizações no Django quando estou escrevendo testes. Isso é principalmente para testar os formulários. Aqui está um snippet de uma solicitação de teste simples:

from django.tests import TestCase

class MyTests(TestCase):
    def test_forms(self):
        response = self.client.post("/my/form/", {'something':'something'})
        self.assertEqual(response.status_code, 200) # we get our page back with an error

A página sempre retorna uma resposta de 200, haja ou não um erro de formulário. Como posso verificar se meu formulário falhou e se o campo específico ( soemthing) apresentou um erro?

Respostas:


250

Eu acho que se você deseja apenas testar o formulário, você deve apenas testar o formulário e não a visualização onde o formulário é renderizado. Exemplo para se ter uma ideia:

from django.test import TestCase
from myapp.forms import MyForm

class MyTests(TestCase):
    def test_forms(self):
        form_data = {'something': 'something'}
        form = MyForm(data=form_data)
        self.assertTrue(form.is_valid())
        ... # other tests relating forms, for example checking the form data

62
+1. A ideia dos testes de unidade é testar cada unidade separadamente.
Daniel Roseman,

13
@Daniel Mas os testes de integração são muito mais úteis e mais propensos a detectar bugs.
wobbily_col

19
@wobbily_col Também leva mais tempo para identificar qual é o bug real em um teste de integração. Em um teste de unidade é mais óbvio. Acho que, para uma boa cobertura de teste, você precisa de ambos.
Torsten Engelbrecht

11
É assim que você verifica se há um erro de formulário específico:self.assertEquals(form.errors['recipient'], [u"That recipient isn't valid"])
Emil Stenström

18
self.assertEqual(form.is_valid(), True)poderia ser simplificado:self.assertTrue(form.is_valid())
Adam Taylor

76

https://docs.djangoproject.com/en/stable/topics/testing/tools/#django.test.SimpleTestCase.assertFormError

from django.tests import TestCase

class MyTests(TestCase):
    def test_forms(self):
        response = self.client.post("/my/form/", {'something':'something'})
        self.assertFormError(response, 'form', 'something', 'This field is required.')

Onde "formulário" é o nome da variável de contexto do seu formulário, "algo" é o nome do campo e "Este campo é obrigatório". é o texto exato do erro de validação esperado.


Isso gera um AttibuteError para mim: AttributeError: o objeto 'SafeUnicode' não tem atributo 'erros'
sbaechler

para usuários novatos: crie um usuário com antecedência e use self.client.force_login(self.user)como primeira linha no método de teste.
sgauri

Tive um problema com este post (), então descobri que deveria enviá-lo como multiparte conforme a seguir response = self.client.post ("/ form-url /", data = {'name': 'test123' , 'categoria': 1, 'nota': 'nota123'}, content_type = django.test.client.MULTIPART_CONTENT) Se algum travou na obtenção de instância vazia ao salvar o formulário, verifique as solicitações enviadas do navegador
Ghaleb Khaled

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.