Tôi nên viết bài kiểm tra cho Biểu mẫu trong Django như thế nào?


109

Tôi muốn mô phỏng các yêu cầu đối với quan điểm của mình trong Django khi tôi đang viết bài kiểm tra. Điều này chủ yếu là để kiểm tra các hình thức. Đây là đoạn mã của một yêu cầu thử nghiệm đơn giản:

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

Trang luôn trả về phản hồi 200 cho dù có lỗi biểu mẫu hay không. Làm cách nào để kiểm tra xem Biểu mẫu của tôi không thành công và trường cụ thể ( soemthing) có lỗi không?

Câu trả lời:


250

Tôi nghĩ nếu bạn chỉ muốn kiểm tra biểu mẫu, thì bạn chỉ nên kiểm tra biểu mẫu chứ không phải xem nơi biểu mẫu được hiển thị. Ví dụ để có một ý tưởng:

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. Ý tưởng của các bài kiểm tra đơn vị là kiểm tra từng đơn vị riêng biệt.
Daniel Roseman

13
@Daniel Nhưng các bài kiểm tra tích hợp hữu ích hơn và có nhiều khả năng bắt lỗi hơn.
wobbily_col

19
@wobbily_col Cũng cần nhiều thời gian hơn để phát hiện đâu là lỗi thực sự trong kiểm tra tích hợp. Trong một bài kiểm tra đơn vị của nó rõ ràng hơn. Mặc dù vậy, tôi nghĩ rằng để có một phạm vi kiểm tra tốt, bạn cần cả hai.
Torsten Engelbrecht

11
Đây là cách bạn kiểm tra một lỗi hình thức cụ thể:self.assertEquals(form.errors['recipient'], [u"That recipient isn't valid"])
Emil Stenström

18
self.assertEqual(form.is_valid(), True)có thể được đơn giản hóa: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.')

Trong đó "biểu mẫu" là tên biến ngữ cảnh cho biểu mẫu của bạn, "cái gì đó" là tên trường và "Trường này là bắt buộc." là văn bản chính xác của lỗi xác thực mong đợi.


Điều này gây ra lỗi AttibuteError đối với tôi: AttributeError: Đối tượng 'SafeUnicode' không có thuộc tính 'lỗi'
sbaechler

dành cho người dùng mới: tạo trước một người dùng và sử dụng self.client.force_login(self.user)làm dòng đầu tiên trong phương pháp thử nghiệm.
sgauri 15/03/18

Tôi gặp sự cố với bài đăng này (), sau đó tôi phát hiện ra rằng tôi phải gửi nó dưới dạng nhiều phần như sau response = self.client.post ("/ form-url /", data = {'name': 'test123' , 'category': 1, 'note': 'note123'}, content_type = django.test.client.MULTIPART_CONTENT) Nếu bất kỳ trường hợp nào gặp khó khăn với việc lấy mẫu trống khi lưu biểu mẫu, hãy kiểm tra các yêu cầu được gửi từ trình duyệt
Ghaleb Khaled

17

Câu trả lời ban đầu của năm 2011 là

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

Nhưng tôi thấy bây giờ (2018) có rất nhiều xác nhận có thể áp dụng được :

  • khẳng định
  • khẳng định
  • khẳng định
  • khẳng địnhFormsetError

Bạn chọn đi.


+1 Điều này phù hợp với tôi khi đó là lỗi Biểu mẫu chung không được đính kèm vào một trường.
Aaron Lelevier
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.