Як слід писати тести на форми у Django?


109

Я б хотів імітувати запити до моїх поглядів у Джанго, коли я пишу тести. Це головним чином для перевірки форм. Ось фрагмент простого тестового запиту:

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
@Daniel Але тести на інтеграцію набагато корисніші та швидше виявляють помилки.
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())
Адам Тейлор

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)як перший рядок у методі тестування.
сгаурі

У мене виникла проблема з цією публікацією (), тоді я зрозумів, що мені потрібно надіслати її як багатопартійну як наступну відповідь = 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 р.) Доступна ціла сукупність застосовних тверджень :

  • assrtRaisesMessage
  • assertFieldOutput
  • assertFormError
  • assertFormsetError

Візьміть свій вибір.


+1 Це працювало для мене, коли це була загальна помилка форми, яка не додається до поля.
Аарон Лелев'є
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.