создание тестов для форм: как увидеть ошибки формы при сбое тестовых утверждений

#python #django #unit-testing

#python #django #модульное тестирование

Вопрос:

В настоящее время я пытаюсь создать тест для своей формы, который наверняка является допустимым, потому что я тестировал его вручную в своем приложении, но в моем тесте покажите мне, что моя форма.is_valid == False. Я не знаю, что я делаю не так в своем тесте, есть ли способ проверить каждое поле отдельно, чтобы найти причину недействительности в моей тестируемой форме?

Мой код:

forms.py

 from django.forms import ModelForm
from django import forms

from .models import Comment


class CommentForm(ModelForm):
    class Meta:
        model = Comment
        fields = ['nick', 'rate', 'content']
        widgets = {'nick': forms.HiddenInput()}
  

test_forms.py

 from django.test import TestCase
from django.contrib.auth.models import User
from ..forms import CommentForm


class CommentFormTest(TestCase):

    def test_form(self):
        user = User.objects.create(username='Testowy')
        form_data = {
            'nick': user,
            'rate': '1',
            'content': 'test content',
        }
        form = CommentForm(data=form_data)
        self.assertEqual(form.is_valid(), True)
  

Комментарии:

1. Напишите свой тест следующим образом: self.assertTrue(form.is_valid(), f"Form should be valid but has following errors: {form.errors}") чтобы он показывал вам ошибки формы.

2. итак, у меня проблема с моим полем «ник», здесь должен быть ник 1 из уже зарегистрированных пользователей (это ForeignKey для User model), поэтому я попытался создать нового пользователя в своем тесте, но это не сработало. у меня эта ошибка «Выберите правильное значение. Given не является одним из доступных вариантов.», есть ли возможность создать или импортировать user для целей тестирования?

3. В данных, которые вы публикуете, вы должны указывать идентификатор пользователя: 'nick': user.id

4. спасибо, проблема решена 🙂

5. Но просто в качестве дополнительного примечания: никогда не полагайтесь на опубликованные данные, чтобы связать комментарий с пользователем. Любой может отправить форму с другим идентификатором пользователя, даже если это скрытое поле.

Ответ №1:

Тестовые утверждения всегда имеют необязательный аргумент (последний или msg ), позволяющий распечатать сообщение в случае сбоя утверждения. Вы должны использовать это как можно чаще в своих тестах (если только сам результат не очевиден), чтобы помочь вам определить причину сбоя утверждения:

 self.assertTrue(
    form.is_valid(),  
    msg=f"form should have been valid, but contains errors: {form.errors}")
  

Таким образом, ошибки будут выведены на вывод вашей тестовой консоли.