Django에서 Forms에 대한 테스트를 어떻게 작성해야합니까?


109

테스트를 작성할 때 Django의 뷰에 대한 요청을 시뮬레이션하고 싶습니다. 이것은 주로 양식을 테스트하기위한 것입니다. 다음은 간단한 테스트 요청의 스 니펫입니다.

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

페이지는 양식 오류 여부에 관계없이 항상 200의 응답을 반환합니다. 내 양식이 실패하고 특정 필드 ( soemthing)에 오류가 있는지 어떻게 확인할 수 있습니까?

답변:


250

폼을 테스트하고 싶다면 폼이 렌더링되는 뷰가 아니라 폼만 테스트해야한다고 생각합니다. 아이디어를 얻는 예 :

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. 단위 테스트 의 개념은 각 단위를 개별적으로 테스트하는 것입니다.
Daniel Roseman 2011 년

13
@Daniel 그러나 통합 테스트는 훨씬 더 유용하고 버그를 잡을 가능성이 더 큽니다.
wobbily_col 2014

19
@wobbily_col 또한 통합 테스트에서 실제 버그가 무엇인지 파악하는 데 더 많은 시간이 걸립니다. 단위 테스트에서는 더 분명합니다. 어쨌든 좋은 테스트 커버리지를 위해서는 둘 다 필요하다고 생각합니다.
Torsten Engelbrecht 2014

11
다음은 특정 양식 오류를 확인하는 방법입니다.self.assertEquals(form.errors['recipient'], [u"That recipient isn't valid"])
Emil Stenström

18
self.assertEqual(form.is_valid(), True)단순화 할 수 있습니다.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"은 양식의 컨텍스트 변수 이름이고 "something"은 필드 이름이며 "This field is required"입니다. 예상 된 유효성 검사 오류의 정확한 텍스트입니다.


이것은 나를 위해 AttibuteError을 제기 AttributeError를 'SafeUnicode'개체가 어떤 속성 '오류'가 없다
sbaechler

초보자 사용자 : 미리 사용자를 생성 self.client.force_login(self.user)하고 테스트 방법의 첫 번째 줄로 사용 합니다.
sgauri

이 post ()에 문제가있는 다음 response = self.client.post ( "/ form-url /", data = { '이름': 'test123' , 'category': 1, 'note': 'note123'}, content_type = django.test.client.MULTIPART_CONTENT) 양식을 저장할 때 빈 인스턴스를 가져 오는 데 문제가 있으면 브라우저에서 보낸 요청을 확인합니다.
Ghaleb Khaled

17

원래 2011 년 답변은

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

하지만 지금 (2018) 에 적용 가능한 주장이 많이 있습니다 .

  • assertRaisesMessage
  • assertFieldOutput
  • assertFormError
  • assertFormsetError

선택해라.


+1 필드에 첨부되지 않은 일반적인 양식 오류 일 때 이것은 저에게 효과적이었습니다.
Aaron Lelevier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.