Не получается протестировать class-based view на Python, Django

Рейтинг: 0Ответов: 1Опубликовано: 22.04.2023

не так давно начал изучать тестирование в Django и столкнулся с проблемой. В коде view есть class-based view, который наследуется от UpdateView и служит для обновления комментариев пользователей (сайт форум). Вроде бы все работает отлично при 'обычном тестировании' на запущенном сайте, когда обновляю комментарий то он действительно меняется, обновляется в Базе Данных. Однако решил я его протестировать с помощью django.test, и, по какой-то причине, обновления не происходит. То есть комментарий, который я отправляю в запросе, не записывается в Базу Данных, а остается тот, который был. КОД самого класса:

class PostUpdateView(UpdateView, LoginRequiredMixin):
    model = Post
    redirect_field_name = 'login'
    form_class = AddCommentForm
    template_name = 'main/edit_post.html'
    initial = {'title': '', 'text': ''}

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["button_label"] = 'Обновить комментарий'
        return context

    def get(self, request, *args, **kwargs):
        user_id_from_request = request.user.id
        post_id = kwargs.get('pk')

        try:
            post = Post.objects.get(pk=post_id)
        except ObjectDoesNotExist:
            raise Http404

        title, text = post.title, post.text
        self.initial['title'] = title
        self.initial['text'] = text
        form = self.form_class(initial=self.initial)

        if user_id_from_request != post.author_id:                 # Prevents URL injection
            raise Http404

        return render(request, self.template_name, {"form": form})
               

Код модели Post(комментарий):

class Post(models.Model):

    category = models.ForeignKey(SubCategory, on_delete=models.CASCADE)
    author = models.ForeignKey(Author, on_delete=models.SET(_('Удаленный аккаунт')))
    title = models.CharField(max_length=255)
    text = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    is_published = models.BooleanField(default=True)

    def get_absolute_url(self):
        return reverse('main:edit_post', kwargs={'pk': self.pk})

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = _('Пост')
        verbose_name_plural = _('Посты')
        ordering = ('-created_at', 'author')
                                                                                                                                                          

Код url:

app_name = 'main'

urlpatterns = [
    path('', views.HomePageView.as_view(), name='home'),
    path('category/<slug:slug>/', views.category_detail, name='category'),
    path('category/posts/<slug:subcategory_slug>/', views.subcategory_post, name='subcategory_post'),
    path('category/posts/<int:pk>', views.PostUpdateView.as_view(), name='edit_post')

]

Код тестов:

class ViewEditPost(TestCase):

    fixtures = ['db.json']

    def setUp(self) -> None:
        self.post = Post.objects.get(id=3)     #post by superuser
        self.url = reverse('main:edit_post', kwargs={'pk': self.post.id})
        self.data = {
            'title': 'Changed the content of the post',
            'text': 'Changed the text of the post LOL XD'
        }

    def test_edit_post_if_user_is_not_authenticated(self):
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 404)

    def test_edit_post_if_user_is_authenticated(self):
        self.client.login(email='mishabur38@gmail.com', password='1234')

        response = self.client.get(self.url, data=self.data)
        print(response)
        self.assertEqual(response.status_code, 200)
        self.post.refresh_from_db()
        print(self.post.text)

Ответы

▲ 0

Я не заглядывал в класс UpdateView, но подозреваю, что в нём описан метод post, который занимается записью в БД. Соответственно тестировать нужно метод post не метод get (self.client.get).