Модульное тестирование FileField и ImageField на Django с помощью ContentFile

Я использую Django 3.2

У меня есть такая модель:

Класс Foo

class Foo(models.Model):
    name = models.CharField(max_length=124)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    description = models.TextField()
    bio = models.TextField()
    attachment = models.FileField()
    photo = models.ImageField()
    recorded_date = models.DateField()
    time_of_day = models.TimeField()
    timestamp = models.DateTimeField()
    duration = models.DurationField()
    website = models.URLField()
    pseudo_array = models.CharField(max_length=256)
    pseudo_tags = models.CharField(max_length=128)

Фрагмент модульного теста

import glob
import os
import json

from datetime import datetime, timedelta
from django.utils.timezone import make_aware

from model_bakery import baker

from django.test import TestCase
from django.core.exceptions import ValidationError
from django.core.files.base import ContentFile



image_mock =ContentFile(b"R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==", name='photo.png')  
file_mock = ContentFile("Some random text", name='archive.txt')  



class TestModels(TestCase):
    def setUp(self):
        current_timestamp = datetime.now(timezone.utc)



        self.foo = Foo.objects.create( name='Accepted Object',bio='For accepted testing',
                                   owner=self.pattysmith,
                                   description='Object for accepted testing',
                                   attachment = file_mock,
                                   photo = image_mock,
                                   recorded_date = datetime.strptime('20200101','%Y%m%d'),
                                   time_of_day = datetime.strptime('10:00','%H:%M'),
                                   timestamp = make_aware(timezone.now().strptime('20200101 10:00','%Y%m%d %H:%M')),
                                   duration = timedelta(days=20, hours=10),
                                   website  = 'https://www.accepted.com',
                                   moderation_status=1,
                                   pseudo_tags='approved,nice, accepted'                            
                                 )    


    def tearDown(self):
        Foo.objects.all().delete()
        User.objects.all().delete()

        for f in glob.glob("*.png"):
            os.remove(f)

        for f in glob.glob("*.txt"):
            os.remove(f)            




    def test_change_moderated_char_field(self):
   
        self.foo.name='My new name'
        self.foo.save(update_fields=['name'])

        # test for number of changed fields ...

Когда я запускаю тест test_change_moderated_char_field, я вижу, что имена полей file и image изменились - похоже, Django автоматически генерирует имена файлов.

Вот как выглядит распечатка моей консоли:

moderated_field_current_field_value: 'My new name'  !=  'Accepted Object'  for moderated field:  name
moderated_field_current_field_value: /path/to/archive_Fo8NWLI.txt  !=  /path/to/archive.txt  for moderated field:  attachment
moderated_field_current_field_value: /path/to/photo_mVEyGtI.png  !=  /path/to/photo.png  for moderated field:  photo
@@@@@@@@@   changed_fields:  ["name", "attachment", "photo"]      @@@@@

В настоящее время я получаю доступ к имени файла/изображения, обращаясь к атрибуту path в поле. Как я могу получить имя файла, когда он фактически загружен (поскольку, похоже, происходит некоторое искажение имени?

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