Django'da Formlar için nasıl test yazmalıyım?


110

Testler yazarken, Django'daki görüşlerime istekleri simüle etmek istiyorum. Bu esas olarak formları test etmek içindir. İşte basit bir test isteğinin bir parçası:

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

Sayfa, bir form hatası olsa da olmasa da her zaman 200 yanıtını döndürür. Formumun başarısız olduğunu ve belirli bir alanda ( soemthing) bir hata olup olmadığını nasıl kontrol edebilirim ?

Yanıtlar:


250

Bence sadece formu test etmek istiyorsanız, o zaman formun oluşturulduğu görünümü değil, sadece formu test etmelisiniz. Bir fikir edinmek için örnek:

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. Fikri birim testlerinin ayrı ayrı üniteyi test etmektir.
Daniel Roseman

13
@Daniel Ancak entegrasyon testleri çok daha kullanışlıdır ve hataları yakalama olasılığı daha yüksektir.
wobbily_col

19
@wobbily_col Bir entegrasyon testindeki asıl hatanın ne olduğunu belirlemek daha fazla zaman alır. Bir birim testinde daha belirgindir. İyi bir test kapsamı için yine de ikisine de ihtiyacınız olduğunu düşünüyorum.
Torsten Engelbrecht

11
Belirli bir form hatasını şu şekilde kontrol edersiniz:self.assertEquals(form.errors['recipient'], [u"That recipient isn't valid"])
Emil Stenström

18
self.assertEqual(form.is_valid(), True)basitleştirilebilir: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.')

"Form", formunuz için bağlam değişkeni adıdır, "bir şey" alan adıdır ve "Bu alan gereklidir." beklenen doğrulama hatasının tam metnidir.


Bu benim için bir AttibuteError oluşturuyor: AttributeError: 'SafeUnicode' nesnesinin 'error' özniteliği yok
sbaechler

acemi kullanıcılar için: önceden bir kullanıcı oluşturun self.client.force_login(self.user)ve test yönteminde ilk satır olarak kullanın .
sgauri

Bu gönderi () ile ilgili bir sorun yaşadım, ardından bunu çok parçalı olarak şu şekilde göndermem gerektiğini anladım: response = self.client.post ("/ form-url /", data = {'name': 'test123' , 'kategori': 1, 'not': 'note123'}, content_type = django.test.client.MULTIPART_CONTENT) Formu kaydederken boş örnek alma sırasında herhangi bir sorun yaşarsanız, tarayıcıdan gönderilen istekleri kontrol edin
Ghaleb Khaled

17

2011'in orijinal cevabı şuydu:

self.assertContains(response, "Invalid message here", 1, 200)

Ama şimdi görüyorum (2018) , bir sürü uygulanabilir iddia var :

  • assertRaisesMessage
  • assertFieldOutput
  • assertFormError
  • assertFormsetError

İstediğini al.


+1 Bu, bir alana eklenmeyen genel bir Form hatası olduğunda benim için çalıştı.
Aaron Lelevier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.