Как протестировать конечную точку POST не-REST в django?
У меня проблемы с тестированием одной из моих конечных точек:
@require_http_methods(["POST"])
def store(request):
try:
body_unicode = request.body.decode('utf-8')
body = ast.literal_eval(body_unicode)
new_short_url = body['short_url']
original_url = body['original_url']
check_parameters(new_short_url, original_url)
Url.objects.create(short_url=new_short_url, original_url=original_url)
return HttpResponse('Created', status=201)
except KeyError as error:
return HttpResponse('Missing {}'.format(error.args), status=400)
except (AttributeError, IntegrityError, ValidationError) as error:
return HttpResponse(error.args, status=400)
Как вы можете видеть, эта конечная точка принимает только POST запросы, и при попытке передать данные из моих тестов, они поступают в request.body, поэтому я реализовал свою логику, чтобы получить данные оттуда:
def test_create_url_ok(self):
creation_data = {
"short_url": "ab",
"original_url": "https://stackoverflow.com/"
}
response = self.client.post(reverse('store'), data=creation_data, content_type="application/json")
self.assertEqual(response.status_code, 201)
Это работает, но проблема в том, что при отправке запросов из моих шаблонов данные попадают не в request.body, а в request.POST. Как отправить данные в request.POST из моих тестов?
Дело в том, что ванильный django принимает данные из request.POST, когда content_type='multipart/form-data'. Поскольку я использовал 'json', это не работало (хотя работает при использовании представлений DjangoRestFramework):
При использовании стандартных тестов django, этот content_type является типом по умолчанию, поэтому вам не нужно указывать его: