Django Rest Framework测试用例中ListAPIView的GET请求无法识别查询参数

5fjcxozz  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(169)

我在Django Rest Framework测试用例中遇到了一个问题,其中对ListAPIView的GET请求似乎无法识别查询参数。当通过Postman发送时,相同的请求可以正常工作,但在测试用例中执行时会失败。

以下是问题的概述:

我有一个ListAPIView,它表示模型示例的集合。通过Postman手动测试时,该视图工作正常,它需要一个名为**'project'的查询参数来根据特定项目过滤集合。
但是,当我尝试向测试用例中的同一ListAPIView发送GET请求时,查询参数
'project'**无法识别,导致错误响应,指示需要project字段。

下面是我测试用例中相关代码的简化版本:

class ShiftListTests(APITestCase):
def setUp(self):
    self.user = User.objects.create_user(username='testuser', password='testpassword')
    self.client.force_authenticate(user=self.user)

    self.project = Project.objects.create(owner=self.user, task='Test Task',
                                          technical_requirement='Test Requirement', start='2023-05-01',
                                          hourly_rate=10.0)

    self.shift1 = Shift.objects.create(project=self.project,
                                       start_time=timezone.make_aware(timezone.datetime(2023, 5, 1, 9, 0, 0)),
                                       end_time=timezone.make_aware(timezone.datetime(2023, 5, 1, 17, 0, 0)))
    self.shift2 = Shift.objects.create(project=self.project,
                                       start_time=timezone.make_aware(timezone.datetime(2023, 5, 2, 9, 0, 0)),
                                       end_time=timezone.make_aware(timezone.datetime(2023, 5, 2, 17, 0, 0)))

def test_get_shift_list(self):
    url = reverse('shift list')
    payload = {'project': self.project.id}
    response = self.client.get(url, data=payload, format='json')
    self.assertEqual(response.status_code, status.HTTP_200_OK)
    # Assertion and further processing...

错误:

Failure
    Traceback (most recent call last):
        File "/Users/Tokio/Developer/ShiftBot/shift/tests/testShiftListEndPoint.py",
    line 44, in test_get_shift_list
    self.assertEqual(response.status_code, status.HTTP_200_OK)
    AssertionError: 400 != 200

{'project': ErrorDetail(string='This field is required', code='invalid')}

我已经验证了URL是正确的,有效负载是正确构造的,并且数据参数被正确地传递给了client.get()方法。我还确认了在使用Postman进行测试时,项目字段包含在GET请求中。
我怀疑在测试环境和实际的API服务器之间处理请求的方式可能存在一些差异,导致查询参数在测试用例中被忽略或无法识别。
如果您能提供任何关于为什么在测试用例中没有识别查询参数以及如何解决这个问题的见解或建议,我们将不胜感激。谢谢你!

eoigrqb6

eoigrqb61#

尝试在JSON转储中发送数据
data={'data': json.dumps(payload)}
另外,通常如果您需要发送请求正文,理想情况下应该使用POST请求。

相关问题