Django – как изменить путь загрузки FileField_to во время тестирования

Я пишу тестовый пример для модели Django с FileField. Я хотел бы изменить путь загрузки, чтобы предотвратить побочные эффекты тестов на остальную часть системы.

Я попытался передать callable для upload_to и исправить это в тестах:

#models.py
upload_path = lambda x, y: 'files'
class Model(models.Model):
    file = models.FileField(upload_to=upload_path)

#tests.py
test_path = mock.Mock()
test_path.return_value = 'files/test'
@mock.patch('models.upload_path', new=test_path)
class ModelTest(object):
    ...

Однако это, похоже, не работает, и я полагаю, что причина в том, что fileField разыменовывает upload_path до запуска любого тестового кода, поэтому уже слишком поздно что-то исправлять.

Как я могу изменить тестовый код, что такое upload_to? В противном случае, как модель может проверить, выполняется ли она тестом?


person dgirardi    schedule 04.11.2012    source источник
comment
В документации сказано: цель импортируется при выполнении украшенной функции, а не во время оформления. Я считаю, что когда вы исправляете «upload_path», ваш объект Model.file уже был установлен ранее с другим upload_to, когда происходил весь импорт. Может быть, проще исправить файл Model.file вместо upload_path   -  person andrefsp    schedule 04.11.2012
comment
@andrefsp Я заработал, используя Model.add_to_class("file", models.FileField(upload_to='files/test')) - я не знаю, правильно ли это сделать, но это работает - спасибо!   -  person dgirardi    schedule 04.11.2012


Ответы (1)


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

#models.py
upload_path = 'files'
class Model(models.Model):
    file = models.FileField(upload_to=lambda x,y: upload_path)

#tests.py
@mock.patch('models.upload_path', 'files/test')
class ModelTest(object):
    ...
person hwjp    schedule 04.11.2012