在Django REST API单元测试中,如何在client.get()函数中发送JSON参数作为请求体?

1 投票
2 回答
1250 浏览
提问于 2025-04-18 07:31

我正在用Django构建一个REST API,在某些地方我需要发送带有很多参数的HTTP GET请求。为了处理这个问题,我决定把这些参数作为JSON格式放在请求的主体中。现在,应用程序运行得很好,但单元测试却不行。我找不到用self.client.get()发送JSON参数的方法。这是我现在的做法:

import json
from django.test import TestCase
from django.core.urlresolvers import reverse

class RestApiTests(TestCase):
    def test_analysis():
        extra = {'CONTENT_TYPE': 'application/json'}
        resp = self.client.get(reverse('restapi_analysis'), data="{'analysisID': 41}", **extra)
        self.assertEqual(json.loads(resp.content)['statusText'], 'Analysis fetched successfully')

使用这个方法运行单元测试时,我遇到了以下错误:

Traceback (most recent call last):
  File "/home/anascu/svn/django-tc-reporting/tcsite/tcapp/tests/test_restapi.py", line 151, in test_analysis
    resp = self.client.get(reverse('restapi_analysis'), data="{'analysisID': 41}", **extra)
  File "/home/anascu/virtenv/tc-tracker/local/lib/python2.7/site-packages/django/test/client.py", line 439, in get
    response = super(Client, self).get(path, data=data, **extra)
  File "/home/anascu/virtenv/tc-tracker/local/lib/python2.7/site-packages/django/test/client.py", line 240, in get
    'QUERY_STRING':    urlencode(data, doseq=True) or parsed[4],
  File "/home/anascu/virtenv/tc-tracker/local/lib/python2.7/site-packages/django/utils/http.py", line 75, in urlencode
for k, v in query],
ValueError: need more than 1 value to unpack

POST请求可以正常工作,但在这种情况下我需要使用GET请求。这可能吗?我使用的Django版本是1.4.5。

2 个回答

0

我希望有人知道一个隐藏的功能。不过,我找到的解决办法是使用 Python Requests 模块。不过在这种情况下,应该在 Django 单元测试中使用 LiveServerTestCase 类,而不是 TestCase。Requests 允许在请求的主体中发送 JSON 内容。

0

Get 方法不会生成请求的内容,你需要使用 postputpatch 方法。

撰写回答