मुझे Django में फ़ॉर्म के लिए परीक्षण कैसे लिखना चाहिए?


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। इकाई परीक्षणों का विचार प्रत्येक इकाई का अलग-अलग परीक्षण करना है।
डैनियल रोसमैन

13
@ डैनियल लेकिन एकीकरण परीक्षण अधिक उपयोगी हैं और बग को पकड़ने की अधिक संभावना है।
wobbily_col

19
@wobbily_col एक एकीकरण परीक्षण में वास्तविक बग क्या है यह जानने के लिए अधिक समय लगता है। एक इकाई में इसके अधिक स्पष्ट परीक्षण। मुझे लगता है कि एक अच्छी परीक्षा कवरेज के लिए आपको वैसे भी दोनों की आवश्यकता होती है।
टॉरस्टेन एंजेलब्रैच

11
यह है कि आप एक विशिष्ट फॉर्म त्रुटि के लिए जाँच कैसे करते हैं:self.assertEquals(form.errors['recipient'], [u"That recipient isn't valid"])
एमिल स्टेनस्ट्रॉम

18
self.assertEqual(form.is_valid(), True)सरलीकृत किया जा सकता है:self.assertTrue(form.is_valid())
एडम टेलर

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.')

जहाँ "फ़ॉर्म" आपके फ़ॉर्म के लिए संदर्भ चर नाम है, "कुछ" फ़ील्ड नाम है, और "यह फ़ील्ड आवश्यक है।" अपेक्षित सत्यापन त्रुटि का सटीक पाठ है।


यह मेरे लिए एक AttibuteError बढ़ाता है: AttributeError: 'SafeUnicode' ऑब्जेक्ट की कोई विशेषता नहीं है 'त्रुटियाँ'
sbaechler

नौसिखिया उपयोगकर्ताओं के लिए: पहले से एक उपयोगकर्ता बनाएं और self.client.force_login(self.user)परीक्षण विधि में पहली पंक्ति के रूप में उपयोग करें ।
सगौरी

मेरे पास इस पोस्ट () के साथ एक समस्या थी, तब मुझे लगा कि मुझे इसे निम्नलिखित प्रतिक्रिया के रूप में मल्टीपार्ट के रूप में भेजना है। self.client.post ("/ form-url /", data = {'name': 'test123' , 'श्रेणी': 1, 'नोट': 'note123'}, content_type = django.test.client.MULTIPART_CONTENT) यदि फॉर्म सहेजते समय कोई खाली उदाहरण मिलता है, तो ब्राउज़र द्वारा भेजे गए अनुरोधों की जांच करें
ग़ालिब खालिद

17

मूल 2011 का उत्तर था

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

लेकिन मैं अब (2018) देख रहा हूँ कि लागू होने वाली पूरी भीड़ उपलब्ध है :

  • assertRaisesMessage
  • assertFieldOutput
  • assertFormError
  • assertFormsetError

अपना चयन ले लो।


+1 यह मेरे लिए तब काम आया जब यह एक सामान्य फॉर्म त्रुटि थी जो किसी फ़ील्ड से जुड़ी नहीं है।
एरोन लेलेयर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.