gpt4 book ai didi

python - 单元测试 Django JSON View

转载 作者:太空狗 更新时间:2023-10-29 18:26:57 26 4
gpt4 key购买 nike

我正在尝试为某些 Django json_view View 编写一些单元测试,但我在将 json_string 传递给 View 时遇到了问题。我昨天发布了一个关于将 json 字符串从 JS 传递到 Django View 的相关问题,问题是在我的 JS 中我只是传递 json 字符串,而我需要将字符串作为对象的属性传递,因为我未能做到这一点,字符串被用作生成的查询字典的键。我再次遇到类似的问题,只是这次它是对 Django View 的 Django 单元测试。这是我的代码的简化版本,它产生相同的结果。

class MyTestCase(TestCase):
def setUp(self):
self.u = User.objects.create_user('test','test','test')
self.u.is_active = True
self.u.save()
self.client.login(username='test',password='test')

def test_create_object_from_form(self):
"""Test the creation of the Instance from the form data."""
import json
json_string json.dumps({'resource':{'type':'book','author':'John Doe'}})
print(json_string)
response = self.client.post(reverse('ajax_view'),
{'form':json_string},'json')
self.assetNotContains(response,'error')

View 看起来像这样

@json_view
def ajax_view(request):
"""Process the incoming form data."""
if request.method == 'POST':
print(request.POST)
form_data = json.loads(request.POST['form'])
resource_data = form_data['resource']
form = MyUserForm(resource_data)

if form.is_valid():
...

这是运行测试时两个打印语句产生的结果。 json_string 是

{"resource": {"type": "book", "author": "John Doe"}}

查询字典看起来像

<QueryDict: {u'{\'form\': \'{"resource": {"type": "book", "author": "John Doe"}}\'}': [u'']}>

我对 JS 和 ajax 完全是新手,所以不用担心会伤害我的自尊心,答案可能非常接近,它可能会跳起来咬我。

最佳答案

最终编辑

我最初声明 header HTTP_X_REQUESTED_WITH='XMLHttpRequest' 在后调用中是必需的,但目前在测试中这是错误的。此 header 对于 csrf 中间件是必需的,但 csrf 在测试中被禁用。但是,我仍然认为即使中间件禁用 csrf 也进行测试是一个好习惯,因为大多数 javascript 库在执行 ajax 时默认情况下已经传递了这个 header 。此外,如果另一段未禁用的代码曾经使用 is_ajax 方法,则您无需花费数小时调试单元测试即可确定 header 丢失。

问题出在内容类型上,因为当 django 在其中获取不同于 text/html 的值时,它不会使用默认的 post 数据处理来格式化您的数据例如在查询中:type=book&author=JohnDoe

那么固定的代码是:

response = self.client.post(reverse('ajax_view'),
{'form':json_string},
HTTP_X_REQUESTED_WITH='XMLHttpRequest')

以下是我自己的使用方式:

post_data = { 
"jsonrpc" : "2.0", "method": method, "params" : params, "id" : id }
return client.post('/api/json/',
json.dumps(post_data), "text/json",
HTTP_X_REQUESTED_WITH='XMLHttpRequest')

做一些 json-rpc。请注意,由于我传递了与默认值不同的内容类型,因此我的数据按 post 请求中的原样传递。

关于python - 单元测试 Django JSON View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4794457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com