Django TestCase при проверке формы завершается ошибкой, даже если введены неверные данные - PullRequest
0 голосов
/ 23 января 2019

Как и в описанном заголовке, у меня есть форма, которая корректно проверяется, когда я использую FormView.Однако сегодня, когда я начал писать тесты, в TestCase произошел сбой одного и того же ввода, и я получил следующую ошибку:

{'programming_language': ['Select a valid choice. That choice is not one of the available choices.']}

Это модели, формы, представления и тест, который я использую

# models.py
from django.db import models


class Tag(models.Model):

    name = models.CharField(max_length=40, unique=True)

class ProgrammingLanguage(models.Model):

    name = models.CharField(max_length=40, unique=True)

class Snippet(models.Model):

    title = models.CharField(max_length=40)
    programming_language = models.ForeignKey(ProgrammingLanguage, on_delete=models.CASCADE)
    creation_date = models.DateTimeField(auto_now_add=True)
    explanation = models.TextField()
    code = models.TextField()
    tags = models.ManyToManyField(Tag)


# forms.py  
from django import forms
from django.utils.translation import gettext_lazy as _

from .models import Snippet

class SnippetForm(forms.ModelForm):

    class Meta:
        model = Snippet
        exclude = ["creation_date"]

# views.py
from django.urls import reverse_lazy
from django.views import generic
from .models import Snippet
from .forms import SnippetForm

class SnippetFormView(generic.FormView):
    template_name = "snippets/snippet_form.html"
    form_class = SnippetForm
    success_url = reverse_lazy("snippets")

    def form_valid(self, form):
        # for testing purposes
        print(form.cleaned_data)
        form.save()
        return super().form_valid(form)

# test_forms.py
from django.test import TestCase

from snippets.forms import SnippetForm
from snippets.models import ProgrammingLanguage, Tag, Snippet

class SnippetFormTestCase(TestCase):

    @classmethod
    def setUpTestData(cls):
        ProgrammingLanguage.objects.create(name="Javascript")
        Tag.objects.create(name="website")

    def test_forms(self):
        form = SnippetForm({
            'title': 'Test snippet title',
            'programming_language': ProgrammingLanguage.objects.get(pk=1),
            'code': 'code here',
            'explanation': 'explanation here',
            'tags': Tag.objects.all()
        })
        # calling is valid to get cleaned_data and original data 
        form.is_valid()
        print(form.data)
        print(form.cleaned_data)
        self.assertEqual(form.errors, {})

Это cleaned_data, которое я получаю в виде:

{'title': 'Test snippet title', 'programming_language': <ProgrammingLanguage: Javascript>, 'explanation': 'explanation here', 'code': 'code here', 'tags': <QuerySet [<Tag: website>]>}

И это данные и cleaned_data, которые я получаю во время теста:

# data
{'title': 'Test snippet title', 'programming_language': <ProgrammingLanguage: Javascript>, 'code': 'code here', 'explanation': 'explanation here', 'tags': <QuerySet [<Tag: website>]>}
# cleaned_data
{'title': 'Test snippet title', 'explanation': 'explanation here', 'code': 'code here', 'tags': <QuerySet [<Tag: website>]>}

ПочемуProgrammingLanguage неверный выбор во время теста, но действителен ли при использовании сайта?

1 Ответ

0 голосов
/ 24 января 2019

Попробуйте это в своем тесте:

form = SnippetForm({
        'title': 'Test snippet title',
        'programming_language': 1, #ProgrammingLanguage.objects.get(pk=1),
        'code': 'code here',
        'explanation': 'explanation here',
        'tags': Tag.objects.all()
    })

При использовании формы для модели, в которой одним из полей является первичный ключ, вы привязываете форму к данным, используя значение pk для такого поля,не образец модели.

Это то, что FormView делает под капотом.И именно поэтому ваш тест не проходит, пока представление работает нормально.

также убедитесь, что у вас есть язык программирования, который pk равен 1.

...