Django REST Framework - Установить запрос в тесте сериализатора для ApiClient - PullRequest
1 голос
/ 07 февраля 2020

Я уже прочитал: Django REST Framework - Установить запрос в тесте сериализатора? . И это не работает для меня! Потому что я использую APIClient, а не RequestFactory, как он.

Я создал веб-приложение, в котором серверная часть реализована с использованием Django REST Framework. Сейчас я пишу юнит-тесты и столкнулся с проблемой при тестировании методов сериализатора. Вот один пример метода сериализатора, с которым я борюсь:

def get_can_edit(self, obj):
  request = self.context['request']
  user = User.objects.get(username=request.user)
  return user == obj.admin

При попытке вызвать это из теста сначала я объявляю экземпляр сериализатора:

Но теперь я нужен self.serializer для правильного запроса, когда get_can_edit делает self.context.get ('request'). Я создал поддельный запрос с правильной информацией, используя APIClient:

self.client = APIClient()
self.client.force_authenticate(user)
conference = a_fake_conference

res = self.client.get('conference:conference-detail'. args=[conference.id])
serializer = ConferenceSerializer(conference, context={WHAT_IS_REQUEST?}) 
# I'm using a dict as context but the request gave me an error: context={'request': { 'user': user }}

sert.assertEqual(res.data, serializer.data)

Теперь я застрял, потому что я не уверен, как добавить request1 в сериализатор так, чтобы request = self.context['request'] вернул

Спасибо.

1 Ответ

1 голос
/ 07 февраля 2020

Используйте wsgi_request (исходный код- Django) из APIClient, чтобы получить объект запроса WSGI.

self.client = APIClient()
self.client.force_authenticate(user)
res = self.client.get('conference:conference-detail'. args=[conference.id]
# make sure to call the `get(...)` method before accessing `wsgi_request` attribute
<b>request_object = res.wsgi_request</b>

Отказ от ответственности: Не уверен, что это способ DRF для получения объекта request.

...