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 также может помочь.