Easy Thumbnails - Как протестировать представление, содержащее поле ThumbnailerImageField в DRF

У меня есть модель под названием "Post", которая выглядит, например, так:

# models.py

from django.db import models
from easy_thumbnails.fields import ThumbnailerImageField

class Post(models.Model):
    name = models.CharField(max_length=255)
    cover = ThumbnailerImageField(upload_to='posts')

Затем у меня есть сериализатор для модели:

# serializers.py

class PostSerializer(serializers.ModelSerializer):
    cover = ThumbnailSerializer(alias='small')

    class Meta:
        model = Post
        fields = ['id', 'name', 'cover']

Наконец, у меня есть представление:

# views.py

class PostView(generics.RetrieveAPIView):
    queryset = Post.objects.filter(enabled=True)
    serializer_class = PostSerializer

Теперь внутри моего теста я пытаюсь создать пост и получить данные (я использую PyTest):

# tests.py

def test_post_endpoint(client):
      post = Post.objects.create(
          name="Post 1",
          cover="posts/test_image.jpg",
      )

      response = client.get('/posts/')
      assert response.status_code == 200
      
      print(response.data['cover'])  
      # This prints:  http://testserver/posts/
      # Instead of:  http://testserver/posts/test_image.small.jpg

Я также пробовал использовать:

cover=SimpleUploadedFile(
    name='test_image.jpg', 
    content=open(image_path, 'rb').read(), 
    content_type='image/jpeg'
)

Но это привело к загрузке изображения на S3, чего я не хочу, поскольку это всего лишь тест, и он не должен ничего загружать в облако.

Как я могу получить правильный ответ для данных обложки? Что-то вроде этого:

'http://testserver/posts/test_image.small.jpg'

Похоже, вы хотите изменить пути MEDIA_ROOT и MEDIA_URL в файле set.py для тестирования Django. Эти значения могут быть заданы на основе переменных окружения, например, так:

# in settings.py
import os
...
if os.environ.get("TEST_ENV", '') == 'TRUE':
    MEDIA_URL = 'http://testserver'
    # or something like that
else:
    MEDIA_URL = '<your default url>'

перед началом работы с тестами необходимо установить переменную окружения:

export TEST_ENV=TRUE

этот пост в блоге может быть полезен.

также, документы Django о том, как работать с файлами с помощью MEDIA_URL могут помочь.

этот сторонний пакет для разделения настроек Django также может помочь.

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