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.