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

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

Мой код:

формы.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)

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

dirkgroten 05.03.2019 19:57

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

Kuracha 05.03.2019 20:07

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

dirkgroten 05.03.2019 20:08

спасибо, проблема решена :)

Kuracha 05.03.2019 20:10

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

dirkgroten 05.03.2019 20:11

в моем представлении.py у меня есть, что этот файл автоматически заполняется уже зарегистрированным пользователем (form = CommentForm(initial = {'nick': request.user})), но если это не хороший метод, я буду искать лучшие методы для сделай так, спасибо за совет

Kuracha 05.03.2019 20:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Другие вопросы по теме