Как протестировать конечную точку 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):

example

При использовании стандартных тестов django, этот content_type является типом по умолчанию, поэтому вам не нужно указывать его:

test

Вернуться на верх