django - 使用 django 测试客户端发送 JSON

我正在开发一个 django 项目,该项目将用作 webhook 的端点。 webhook 会将一些 JSON 数据发布到我的端点,然后它将解析该数据。我正在尝试为它编写单元测试,但我不确定我是否正确发送了 JSON。

我在 pipeline_endpoint 中不断收到“TypeError:字符串索引必须是整数”

代码如下:

# tests.py
from django.test import TestCase
from django.test.client import Client
import simplejson

class TestPipeline(TestCase):

    def setUp(self):
        """initialize the Django test client"""
        self.c = Client()

    def test_200(self):
        json_string = u'{"1": {"guid": "8a40135230f21bdb0130f21c255c0007", "portalId": 999, "email": "fake@email"}}'
        json_data = simplejson.loads(json_string)
        self.response = self.c.post('/pipeline-endpoint', json_data, content_type="application/json")
        self.assertEqual(self.response.status_code, "200")

# views.py
from pipeline.prospect import Prospect
import simplejson

def pipeline_endpoint(request):

    #get the data from the json object that came in
    prospects_json = simplejson.loads(request.raw_post_data)
    for p in prospects_json:
        prospect = {
            'email'          : p['email'],
            'hs_id'          : p['guid'],
            'portal'         : p['portalId'],
        }

编辑:整个回溯。

======================================================================
ERROR: test_200 (pipeline.tests.TestPipeline)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "F:\......\pipeline\tests.py", line 31, in test_200
    self.response = self.c.post('/pipeline-endpoint', json_string, content_type="application/json")
  File "C:\Python27\lib\site-packages\django\test\client.py", line 455, in post
    response = super(Client, self).post(path, data=data, content_type=content_type, **extra)
  File "C:\Python27\lib\site-packages\django\test\client.py", line 256, in post
    return self.request(**r)
  File "C:\Python27\lib\site-packages\django\core\handlers\base.py", line 111, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "F:\......\pipeline\views.py", line 18, in pipeline_endpoint
    'email'          : p['email'],
TypeError: string indices must be integers

----------------------------------------------------------------------
Ran 1 test in 0.095s

FAILED (errors=1)
Destroying test database for alias 'default'...

最佳答案

@mrmagooey 是对的

def test_your_test(self):
    python_dict = {
        "1": {
            "guid": "8a40135230f21bdb0130f21c255c0007",
            "portalId": 999,
            "email": "fake@email"
        }
    }
    response = self.client.post('/pipeline-endpoint/',
                                json.dumps(python_dict),
                                content_type="application/json")

使用 json.dumps 而不是 json.loads

https://stackoverflow.com/questions/8583290/

相关文章:

java - 如何在 Eclipse 中导入 javax.json

java - Gson 将一组数据对象转换为 json - Android

json - Newtonsoft 对象 → 获取 JSON 字符串

python - Django: "TypeError: [] is not JSON serial

json - 如何在所有子项中查询具有特定值的属性的firebase

ajax - 为什么 jqXHR.responseText 返回字符串而不是 JSON 对象?

javascript - 如何在 JSON 中存储 javascript 函数

c# - 配置 JSON.NET 以忽略 DataContract/DataMember 属性

javascript - Flask:单击按钮下载 csv 文件

iOS - 在 swift 中使用 ObjectMapper 映射根 JSON 数组