我有一个测试视图:
@api_view(['POST'])
@permission_classes([AllowAny])
@authentication_classes([])
def test_view(request):
return Response(request.data)
它在urls.py
以下位置注册:
urlpatterns = [
path('api/test/', test_view)
]
当我尝试[{"a": 1}, {"a": 2}]
通过REST Frameworks UI手动进行POST时,一切正常。
但是,如果我为此编写测试,则会发生意外错误。这是测试
from rest_framework.test import APITestCase
class ViewTest(APITestCase):
def test_it(self):
response = self.client.post('/api/test/', [{"a": 1}, {"a": 2}])
print(response)
产生以下错误:
Traceback (most recent call last):
File "C:\development\HeedView\backend\clients\api\tests.py", line 13, in test_it
response = self.client.post('/api/test/', [{"a":1}, {"a": 2}])
File "C:\development\HeedView\venv\lib\site-packages\rest_framework\test.py", line 300, in post
path, data=data, format=format, content_type=content_type, **extra)
File "C:\development\HeedView\venv\lib\site-packages\rest_framework\test.py", line 212, in post
data, content_type = self._encode_data(data, format, content_type)
File "C:\development\HeedView\venv\lib\site-packages\rest_framework\test.py", line 184, in _encode_data
ret = renderer.render(data)
File "C:\development\HeedView\venv\lib\site-packages\rest_framework\renderers.py", line 921, in render
return encode_multipart(self.BOUNDARY, data)
File "C:\development\HeedView\venv\lib\site-packages\django\test\client.py", line 194, in encode_multipart
for (key, value) in data.items():
AttributeError: 'list' object has no attribute 'items'
如何解释这种行为?
要传递json数据,您需要添加format='json'
。此测试有效:
from rest_framework.test import APITestCase
class ViewTest(APITestCase):
def test_it(self):
response = self.client.post('/api/test/', [{"a": "1"}, {"a": 2}], format='json')
print(response.json())
或者,你原来的测试工作,如果你设置的默认格式的settings.py
:
REST_FRAMEWORK = {
...
'TEST_REQUEST_DEFAULT_FORMAT': 'json'
}
如果未指定格式:
该REST框架APIClient扩展Django的现有客户端类。Client.post的文档说明:
数据字典中的键值对用于提交POST数据。例如:
...
client.post('/login/', {'name': 'fred', 'passwd': 'secret'})
... [测试]此POST数据:
name=fred&passwd=secret
您的原始测试返回错误,因为如果未指定格式,则Django需要字典,而不是列表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句