You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
DjangoBlog/comments/tests.py

104 lines
4.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 导入Django测试相关工具
from django.test import Client, RequestFactory, TransactionTestCase
from django.urls import reverse # 用于反向解析URL
# 导入相关模型和工具
from accounts.models import BlogUser # 用户模型
from blog.models import Category, Article # 博客分类和文章模型
from comments.models import Comment # 评论模型
from comments.templatetags.comments_tags import * # 评论相关的模板标签
from djangoblog.utils import get_max_articleid_commentid # 工具函数
# 创建测试类继承TransactionTestCase支持事务的测试类适合涉及数据库事务的测试
class CommentsTest(TransactionTestCase):
def setUp(self):
"""测试前的初始化设置,每个测试方法执行前都会调用"""
self.client = Client() # 创建测试客户端,用于模拟用户请求
self.factory = RequestFactory() # 创建请求工厂,用于构造请求对象
# 配置博客设置(评论需要审核)
from blog.models import BlogSettings
value = BlogSettings()
value.comment_need_review = True # 评论需要审核才能显示
value.save()
# 创建超级用户(用于测试登录状态下的评论功能)
self.user = BlogUser.objects.create_superuser(
email="liangliangyy1@gmail.com",
username="liangliangyy1",
password="liangliangyy1")
def update_article_comment_status(self, article):
"""辅助方法:更新文章所有评论为启用状态(模拟审核通过)"""
comments = article.comment_set.all() # 获取文章的所有评论
for comment in comments:
comment.is_enable = True # 设为启用
comment.save() # 保存更改
def test_validate_comment(self):
"""测试评论功能的核心逻辑:发布评论、回复评论、评论显示等"""
# 登录测试用户
self.client.login(username='liangliangyy1', password='liangliangyy1')
# 创建测试分类
category = Category()
category.name = "categoryccc"
category.save()
# 创建测试文章
article = Article()
article.title = "nicetitleccc"
article.body = "nicecontentccc"
article.author = self.user # 关联作者
article.category = category # 关联分类
article.type = 'a' # 文章类型(假设'a'表示普通文章)
article.status = 'p' # 发布状态(假设'p'表示已发布)
article.save()
# 获取评论提交的URL反向解析评论提交视图
comment_url = reverse(
'comments:postcomment', kwargs={
'article_id': article.id}) # 传入文章ID参数
# 测试发布第一条评论
response = self.client.post(comment_url,
{
'body': '123ffffffffff' # 评论内容
})
# 验证评论提交后是否重定向(通常评论成功后会跳转到文章页)
self.assertEqual(response.status_code, 302)
# 重新获取文章对象(从数据库刷新)
article = Article.objects.get(pk=article.pk)
# 因为评论需要审核初始is_enable=False所以评论列表长度应为0
self.assertEqual(len(article.comment_list()), 0)
# 调用辅助方法,将评论设为启用(模拟审核通过)
self.update_article_comment_status(article)
# 此时评论列表应包含1条评论
self.assertEqual(len(article.comment_list()), 1)
# 测试发布第二条评论
response = self.client.post(comment_url,
{
'body': '123ffffffffff',
})
self.assertEqual(response.status_code, 302) # 验证重定向
article = Article.objects.get(pk=article.pk)
self.update_article_comment_status(article)
self.assertEqual(len(article.comment_list()), 2) # 验证评论数量
# 测试回复评论功能
# 获取第一条评论的ID作为父评论ID
parent_comment_id = article.comment_list()[0].id
# 发布带Markdown格式的回复测试富文本内容
response = self.client.post(comment_url,
{
'body': '''
# Title1 Markdown标题
```python
import os # Markdown代码块