Можно ли как-то вызвать логику из form_valid () в тестах Django? - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь проверить форму для создания модели Post в моем простом приложении на форуме. У меня проблема в том, что после того, как я пытаюсь сохранить форму в тестах, я получаю ошибку NOT NULL constraint failed: forum_web_post.user_id, потому что я назначаю пользователя в методе form_valid() в представлении. Пользователь не передается через форму, поскольку пользователь, создавший сообщение, является вошедшим в систему пользователем, который отправил запрос.

models.py

class Post(models.Model):
    category = models.ForeignKey(Category, on_delete=models.PROTECT)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    text = models.TextField()
    created_at = models.DateTimeField(auto_now=True)

пользователь импортирует форму django.contrib.auth.models, а модель категории выглядит следующим образом.

class Category(models.Model):
    name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now=True)

через views.py после того, как пользователь отправляет форму, которую он перенаправляет на страницу своего профиля

views.py

class PostCreate(generic.CreateView):
    model = Post
    form_class = PostForm
    template_name = 'forum_web/post_edit.html'

    def form_valid(self, form):
        post = form.save(commit=False)
        post.user = models.User.objects.get(id=self.request.user.id)
        post.save()
        return HttpResponseRedirect(reverse_lazy('forum:user_detail', kwargs={'pk': self.request.user.id}))

forms.py

class PostForm(ModelForm):
    class Meta:
        model = Post
        fields = ['category', 'title', 'text']

tests.py

    def test_post_form_create_should_pass(self):
        # this dict is in setUp() as well as the test_category but for simplicity I will include it in this method
        post_data = {
        'category': self.test_category.pk,
        'title': 'test_post',
        'text': 'test_post_text'
        }
        post_count = Post.objects.count()
        form = PostForm(data=self.post_data)
        self.assertTrue(form.is_valid())
        form.save()
        self.assertEqual(post_count + 1, Post.objects.count())

любая помощь будет оценена!

1 Ответ

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

Вы просто тестируете форму.Поэтому нет смысла вызывать функцию просмотра в вашем тесте.Вы должны вручную назначить пользователя для экземпляра формы, используя form.instance.user = ..., перед сохранением формы в своем тесте, поскольку именно так должна использоваться форма.

Кроме того, вы должны проверить свое представление, фактически войдя в систему.пользователь и размещение запроса в представлении PostCreate.Здесь вы проверяете, что представление правильно сохраняет форму (и что ваш form_valid() метод работает правильно).

Примечание: post.user = self.request.user будет лучше, чем повторное извлечение пользователя из базы данных с помощью id.Это избыточно.

...