尝试为文件上传编写单元测试到 django Restless API
Trying to write a unit test for file upload to a django Restless API
我正在编写一个相当小的轻量级 REST api 所以我选择了 restless 作为 quickest/easiest 支持。我似乎不需要 django-REST 模块的所有复杂性和支持。我的服务只会接收和发送 json 但用户需要将文件上传到一个端点。目前我的 view/api 文件上传代码如下:
class SubmissionCreate(Endpoint):
def post(self, request):
# get the data from the post request
data = {}
data['input_data'] = request.FILES['input_data'].read().decode('UTF-8')
data['submission_name'] = request.FILES['submission_name'].read().decode('UTF-8')
submission_form = SubmissionForm(data)
if submission_form.is_valid():
s = submission_form.save()
return {'message': 'file uploaded'}
else:
return {'error': 'Input information is not correctly formatted'}
我也写了一个小客户端,有Requests上传文件
import os
import requests
import json
url = 'http://127.0.0.1:8000/submission/create/'
payload = {'input_data': ('input.txt', open('./static/files/file1.txt', 'rb')), 'submission_name': 'test'}
r = requests.post(url, files=payload)
这很好用,我可以用我的客户端将文件推送到数据库。但很明显,在给出任何更复杂的行为之前,我需要进行一些适当的测试,所以我查看了文档并编写了以下测试
class SubmissionCreateTests(TestCase):
def test_submissioncreate_will_accept_data(self):
f = SimpleUploadedFile("file.txt", bytes("file_content", 'utf-8'))
response = self.client.post(reverse('submission_data'),
{'input_data': f, 'submission_name': 'test'})
self.assertEqual(response.status_code, 200)
但是这会产生以下错误:
django.utils.datastructures.MultiValueDictKeyError: "'submission_name'"
如果我将 content_type 设置为 'application/x-www-form-urlencoded',我会得到同样的错误。
如果我将 content_type 设置为 'multipart/form-data',我会收到 400 错误,但测试 运行 没有抛出异常。
我试图解决这个问题,但最终切换到 Django-REST 框架更快更容易。 Djano-REST 的文档要好得多,因此设置它和构建测试是微不足道的。对于 django 的 restless 或 django-restless 模块,似乎没有节省时间。
我正在编写一个相当小的轻量级 REST api 所以我选择了 restless 作为 quickest/easiest 支持。我似乎不需要 django-REST 模块的所有复杂性和支持。我的服务只会接收和发送 json 但用户需要将文件上传到一个端点。目前我的 view/api 文件上传代码如下:
class SubmissionCreate(Endpoint):
def post(self, request):
# get the data from the post request
data = {}
data['input_data'] = request.FILES['input_data'].read().decode('UTF-8')
data['submission_name'] = request.FILES['submission_name'].read().decode('UTF-8')
submission_form = SubmissionForm(data)
if submission_form.is_valid():
s = submission_form.save()
return {'message': 'file uploaded'}
else:
return {'error': 'Input information is not correctly formatted'}
我也写了一个小客户端,有Requests上传文件
import os
import requests
import json
url = 'http://127.0.0.1:8000/submission/create/'
payload = {'input_data': ('input.txt', open('./static/files/file1.txt', 'rb')), 'submission_name': 'test'}
r = requests.post(url, files=payload)
这很好用,我可以用我的客户端将文件推送到数据库。但很明显,在给出任何更复杂的行为之前,我需要进行一些适当的测试,所以我查看了文档并编写了以下测试
class SubmissionCreateTests(TestCase):
def test_submissioncreate_will_accept_data(self):
f = SimpleUploadedFile("file.txt", bytes("file_content", 'utf-8'))
response = self.client.post(reverse('submission_data'),
{'input_data': f, 'submission_name': 'test'})
self.assertEqual(response.status_code, 200)
但是这会产生以下错误:
django.utils.datastructures.MultiValueDictKeyError: "'submission_name'"
如果我将 content_type 设置为 'application/x-www-form-urlencoded',我会得到同样的错误。
如果我将 content_type 设置为 'multipart/form-data',我会收到 400 错误,但测试 运行 没有抛出异常。
我试图解决这个问题,但最终切换到 Django-REST 框架更快更容易。 Djano-REST 的文档要好得多,因此设置它和构建测试是微不足道的。对于 django 的 restless 或 django-restless 模块,似乎没有节省时间。