【问题标题】:In Django REST API unittest, how do I send JSON parameters as body in client.get() function?在 Django REST API unittest 中,如何在 client.get() 函数中将 JSON 参数作为正文发送?
【发布时间】:2014-07-14 04:27:00
【问题描述】:

我正在使用Django 构建一个 REST API,在某些地方我需要发送带有许多参数的 HTTP GET。因此,我决定在 request.body 中将它们作为 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。

【问题讨论】:

  • 为什么将data 设为字符串?它可以只是 {'analysisID': 41} 删除 JSON 的双引号。我想这是造成整个问题的原因。
  • github.com/django/django/blob/stable/1.4.x/django/utils/… 在这里查看查询dict 而不是string
  • 确实,如果我删除 data 和双引号,我将不会收到之前的错误,但我也不会将 JSON 对象放入正文中。字典将正常传递 QUERY_STRING 并以 QueryDict 结束。

标签: python json django rest django-unittest


【解决方案1】:

Get 方法不创建请求体,需要使用postputpatch

【讨论】:

    【解决方案2】:

    我希望有人知道一个隐藏的功能。无论如何,我找到的解决方法是Python Requests 模块,但在这种情况下,应该在Django 单元测试中使用LiveServerTestCase 类而不是TestCase。 Requests 允许在正文中发送 JSON 内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多