Django APIView单元测试报IndexError但Postman可正常运行的解决方法
问题修复方案
错误原因
单元测试使用独立的测试数据库,默认没有任何PickupData数据,导致all_the_pickup_id是空列表,调用random.choice()时触发IndexError。而Postman测试依赖的开发数据库有数据,因此不会出现该问题。
修复步骤
1. 给单元测试添加测试数据
在测试方法中预先创建PickupData记录,确保测试数据库有数据可供查询:
def test_text_response(self): # 先创建测试数据 PickupData.objects.create(text="测试搭讪话术") client = APIClient() response = client.get('/getPickup/getUnitTest/') self.assertEqual(response['Content-Type'], 'application/json') print('Get Pickup', response.content) self.assertEqual(response.status_code, status.HTTP_200_OK)
如果多个测试方法都需要基础数据,也可以在setUp方法中统一初始化:
def setUp(self): super().setUp() # 每个测试用例执行前创建测试数据 PickupData.objects.create(text="测试搭讪话术")
2. 完善API的空数据容错处理
恢复你注释掉的空列表判断逻辑,避免数据库无数据时崩溃,同时返回符合REST规范的响应:
def get(self, request, **kwargs): all_the_pickup_id = PickupData.objects.values_list('id', flat=True) if not all_the_pickup_id: # 返回404状态码+提示信息,比200更能体现资源不存在的状态 return Response("No pickup lines found.", status=status.HTTP_404_NOT_FOUND) random_id = random.choice(all_the_pickup_id) random_pickup = PickupData.objects.get(id=random_id) random_line = random_pickup.text return Response(random_line)
这样即使测试数据库意外无数据,API也会返回明确的错误响应,而非抛出异常导致测试崩溃。
内容的提问来源于stack exchange,提问作者jessiepinkman
相关产品推荐
相关产品推荐

