Django cookiecutter media/место для тестирования
Проблема: у меня есть поле ImageField в модели. TestCase не может найти файл изображения по умолчанию, чтобы выполнить изменение размера изображения (декоратор @receiver(pre_save, sender=UserProfile))
class UserProfile(Model):
user = ForeignKey(AUTH_USER_MODEL ...)
...
photo = ImageField(
verbose_name=_("Photo"),
upload_to="media",
null=True,
blank=True,
help_text=_("a photo will spark recognition from others."),
default="default.png")
Обзор: Я запускаю тесты локально из pycharm в docker-контейнер. Этот проект основан на проекте django cookiecutter.
Я выполнил поиск целевого файла в хуке presave и файл был найден в этих 2 каталогах ['/app/media/default.png', '/opt/project/media/default.png']
Я получаю ошибку FileNotFound на '/app/<my_project_name>/media/default.png'
Как заставить медиафайл искать в этих каталогах?
@receiver(pre_save, sender=UserProfile)
def user_profile_face_photo_reduction(sender, instance, *args, **kwargs):
"""
This creates the thumbnail photo for a concept
"""
test_image_size(instance) # this is the function that gives problems. it's below.
im = generic_resize_image(size=face_dimensions, image=instance.photo)
save_images_as_filename(
filename=Path(instance.photo.path).with_suffix(".png"),
image=im,
instance=instance,
)
def test_image_size(instance=None, size_limit=None):
"""
size_limit is a namedtuple with a height and width that is too large to save.
instance needs to have a photo attribute to work
"""
if instance and instance.photo:
print([x.absolute() for x in sorted(Path("/").rglob("default.png"))]) # this is where I got the actual location info
assert instance.photo.size <= 10_000_000, ValueError("Image size is too big") # THE PROBLEM LINE IS THIS ONE.
if (
instance.photo.width > size_limit.width
or instance.photo.height > size_limit.height
):
raise ValueError(_("the picture dimensions are too big"))
Вы подключили медиа-тома хост-машины к dockerfile? Вам может понадобиться показать нам dockerfile, чтобы мы могли лучше понять вашу конфигурацию.
.Если запуск тестов с использованием папки непосредственно на хост-машине не является жестким требованием, вы можете создать еще одну папку в корневой папке вашего проекта Django (например, "testmedia"). В вашем файле tests.py вы можете переопределить настройки корня медиа для ваших тестов, чтобы использовать папку "testmedia". Поместите файл изображения вашего теста в эту папку. Вот пример переопределения настроек корня мультимедиа:
TEST_DIR = os.path.join(settings.BASE_DIR, 'testmedia/') #Defines test media root @override_settings(MEDIA_ROOT=(TEST_DIR)) def test_create_blogpost(self): print("\nTesting blog post creation...") testUser = User.objects.create_user(username='testUser', password='12345') #Creates test user self.client.login(username='testuser', password='12345') #Logs in testUser PNGtestpic = SimpleUploadedFile(name="pngtest.png", content=open(settings.MEDIA_ROOT + "pngtest.png", 'rb').read(), content_type='image/png') #Uploads test picture to media root Blogpost.objects.create(title="How to run tests", cover_image= PNGtestpic, author=testUser)
Надеюсь, это поможет!
Я начал с создания каталога "media" в папке app_root (/Users//<project_name>/). Это был глупый шаг. В папке (/Users//<project_name>/<project_name>/media) уже есть папка media, которую я не видел. Я пытался заставить ее, используя такие трюки, как трюк с монтированием docker и изменение моего кода, но это была пустая трата времени.
Я проголосовал за ответ @heyylateef за override_settings, потому что это аккуратный декоратор.