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.

93 lines
3.3 KiB

from django.test import TestCase
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase
from api.models import Students
from api.models import Pledge
from decimal import Decimal
class StudentsAPITests(APITestCase):
def setUp(self):
# 创建一些测试数据
self.student = Students.objects.create(sid='123', name='Student1', score=Decimal('0.0'))
def test_update_student_score(self):
# 测试更新学生积分的功能
response = self.client.post(reverse('update_student_score'), {'student_id': self.student.sid, 'score': 5.5})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.student.refresh_from_db() # 刷新数据库数据
self.assertEqual(self.student.score, Decimal('5.5'))
def test_create_pledge_success(self):
# 测试成功创建典当信息
data = {
'studentId': self.student.sid,
'studentName': self.student.name,
'pledgeScore': 10,
}
response = self.client.post(reverse('create_pledge'), data)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertIn('典当信息已保存', response.data.values())
self.assertTrue(Pledge.objects.filter(student_id=self.student.sid).exists())
def test_create_pledge_missing_fields(self):
# 测试创建典当时缺少字段
data = {
'studentId': self.student.sid,
'studentName': '',
'pledgeScore': 10,
}
response = self.client.post(reverse('create_pledge'), data)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn('所有字段都是必需的', response.data['error'])
def test_update_question_score_success_without_pledge(self):
# 测试更新积分时没有典当信息
data = {
'studentId': self.student.sid,
'questionScore': 2,
}
response = self.client.post(reverse('update_question_score'), data)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.student.refresh_from_db()
self.assertEqual(self.student.score, Decimal('2.0')) # 0.0 + 2
def test_update_question_score_student_not_found(self):
# 测试更新积分时学生不存在
data = {
'studentId': '999', # 一个不存在的学生ID
'questionScore': 5,
}
response = self.client.post(reverse('update_question_score'), data)
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
self.assertEqual(response.data['error'], '学生不存在')
def test_update_question_score_exception_handling(self):
# 测试更新积分时的异常处理
pledge = Pledge.objects.create(student_id=self.student.sid, student_name=self.student.name, pledge_score=5,
status=0)
# 模拟异常(例如分数为字符串)
data = {
'studentId': self.student.sid,
'questionScore': 'invalid_score',
}
response = self.client.post(reverse('update_question_score'), data)
self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)