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)