Django REST framework FileField PUT Testcase - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть модель, которая содержит FileField, который может быть не пустым.При создании тестов для этой модели я столкнулся с проблемой, что я получаю ошибки при тестировании с PUT, в то время как то же самое работает при выполнении POST.В качестве представлений я просто использую generics.ListCreateAPIView для пункта назначения POST и generics.RetrieveUpdateDestroyAPIView для пункта назначения PUT, оба работают нормально при использовании API в браузере.

Полезная нагрузка для POST и PUT создается следующим образом:

uploaded_file = SimpleUploadedFile('TestCode4.c', "Testcode", content_type='text/plain')
self.valid_payload = {
    'name': 'TestValid',
    'test_file': uploaded_file
}

Тогда рабочий тест POST выглядит следующим образом:

client = Client()
response = client.post(
    reverse('code-list'),
    self.valid_payload,
    format='json'
)

И PUT:

client = Client()
response = client.put(
    reverse('code-detail', kwargs={'pk': 1}),
    self.valid_payload,
    format='json'
)

POST возвращает 204 и создает новый объект, в то время как PUT возвращает 415 со следующей ошибкой:

{u'detail': u'Unsupported media type "application/octet-stream" in request.'}

Я не уверен, что здесь идет не так, похоже, что и post, и put передают данные SimpleUploadedFile одинаково, хотяс положением это как-то становится потоком октетов.

1 Ответ

0 голосов
/ 20 сентября 2018

Я выяснил проблему: класс django.test.Client Джанго не поддерживает метод 'PUT'.Вместо этого платформа REST предоставляет класс rest_framework.test.APIClient, который поддерживает PUT (и PATCH и т. Д.).

Функция client.put() теперь должна быть заполнена немного по-другому (я не смог заставить ее работать с SimpleUploadedFile), как объяснено здесь: https://fodra.github.io/2017/05/31/testing-django-rest-api-with-image-field.html

...