Имитация исправления вызываемого upload_to в Django ImageField

В Django у меня есть модель и тест, похожие на следующие, оба в photos модуле (Django app).

models.py

def get_user_photo_path(instance, filename):
    return str(uuid.uuid4())


class UserPhoto(models.Model):
    uploader = models.ForeignKey(User, on_delete=models.CASCADE)
    image = models.ImageField(upload_to=get_user_photo_path)
    upload_timestamp = models.DateTimeField(auto_now_add=True)

tests.py

    @mock.patch('photos.models.get_user_photo_path')
    def test_image_upload_path(self, mock_photo_path):
        mock_photo_path.return_value = 'mocktest'
        user_photo = UserPhoto.objects.create(
            uploader=self.parking_user, # these self variables are defined in setUp()
            image=self.image
        )
        expected_path = 'mocktest'
        self.assertTrue(user_photo.image.name.endswith(expected_path)) # Assertion fails

        # For demonstration, this assertion DOES pass
        from .models import get_user_photo_path
        self.assertEquals(get_user_photo_path(), 'mocktest')

Это не работает, и я не уверен, почему. Но если я импортирую функцию get_user_photo_path непосредственно в тест и вызываю ее, то она возвращает обратно 'mocktest'. Я могу только предположить, что это как-то связано с тем, как ImageField обрабатывает свои аргументы, но из исходного кода ничего не выделяется как особенно странное или необычное.

Я обошел эту проблему, установив вместо нее патч photos.models.uuid.uuid4, но если кто-нибудь сможет объяснить, почему вышеупомянутый патч не работает, я буду очень благодарен!

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