Не получается протестировать class-based view на Python, Django
не так давно начал изучать тестирование в 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)