ฉันจะเขียนแบบทดสอบสำหรับฟอร์มใน Django ได้อย่างไร


110

ฉันต้องการจำลองคำขอสำหรับมุมมองของฉันใน 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

13
@ แดเนียล แต่การทดสอบการผสานรวมเป็นวิธีที่มีประโยชน์มากกว่าและมีแนวโน้มที่จะจับข้อบกพร่องได้มากกว่า
wobbily_col

19
@wobbily_col นอกจากนี้ยังต้องใช้เวลามากขึ้นในการตรวจหาข้อบกพร่องที่แท้จริงในการทดสอบการรวมระบบ ในหน่วยการทดสอบจะชัดเจนมากขึ้น ฉันคิดว่าสำหรับการทดสอบที่ดีคุณต้องมีทั้งสองอย่าง
Torsten Engelbrecht

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" คือชื่อฟิลด์และ "ต้องระบุฟิลด์นี้" เป็นข้อความที่แน่นอนของข้อผิดพลาดในการตรวจสอบความถูกต้องที่คาดไว้


สิ่งนี้ทำให้เกิด AttibuteError สำหรับฉัน: AttributeError: วัตถุ 'SafeUnicode' ไม่มีแอตทริบิวต์ 'ข้อผิดพลาด'
sbaechler

สำหรับผู้ใช้มือใหม่: สร้างผู้ใช้ล่วงหน้าและใช้self.client.force_login(self.user)เป็นบรรทัดแรกในวิธีการทดสอบ
sgauri

ฉันมีปัญหากับโพสต์นี้ () จากนั้นฉันคิดว่าฉันต้องส่งเป็นหลายส่วนดังต่อไปนี้ response = self.client.post ("/ form-url /", data = {'name': '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) มีการยืนยันที่เกี่ยวข้องมากมาย :

  • ยืนยัน
  • assertFieldOutput
  • assertFormError
  • assertFormsetError

เลือกของคุณ


+1 สิ่งนี้ใช้ได้ผลสำหรับฉันเมื่อเป็นข้อผิดพลาดของฟอร์มทั่วไปที่ไม่ได้แนบกับฟิลด์
Aaron Lelevier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.