Настройки переопределения не работают в модульных тестах, когда динамический импорт класса из настроек Django
Все немного сложнее, позвольте мне показать вам минимальный пример.
В моем приложении я динамически импортирую класс из настроек django:
my_settings.py
from django.conf import settings
SETTINGS = getattr(settings, 'ACTSTREAM_SETTINGS', {})
def get_verb_transformer():
mod = SETTINGS.get('VERB_TRANSFORMER', 'actstream.transformers.DefaultVerbTransformer')
mod_path = mod.split('.')
try:
return getattr(__import__('.'.join(mod_path[:-1]), {}, {},
[mod_path[-1]]), mod_path[-1])()
except ImportError:
raise ImportError(
'Cannot import %s try fixing ACTSTREAM_SETTINGS[VERB_TRANSFORMER]'
'setting.' % mod
)
get_verb_transformer
просто импортируйте класс на основе значения VERB_TRANSFORMER
от django.conf.settings
"Таким образом" мы разрешаем разработчикам указывать свои собственные VerbTransformer
учебный класс. Или, если они не предоставляют, встроенный DefaultVerbTransformer
как запасной вариант.
Затем я использовал импортированный класс в других местах:
from . import my_settings
def follow(user, obj, send_action=True, actor_only=True, flag='', **kwargs):
instance, created = apps.get_model('actstream', 'follow').objects.get_or_create(
user=user, object_id=obj.pk, flag=flag,
content_type=ContentType.objects.get_for_model(obj),
actor_only=actor_only
)
if send_action and created:
if not flag:
action.send(user, verb=_('started following'), target=obj, **kwargs)
else:
action.send(user, verb=_('started %s' % flag), target=obj, **kwargs)
########### used here ###########
transformer = settings.get_verb_transformer()
action.send(user, verb=_('started %s' % transformer.trans(flag)), target=obj, **kwargs)
return instance
Затем я хочу проверить, работает ли пользовательская настройка разработчика:
@override_settings(ACTSTREAM_SETTINGS={'VERB_TRANSFORMER':
'actstream.tests.base.TestVerbTransformer'})
def test_follow_verb_transformation(self):
# User4 blocks user3
follow(self.user4, self.another_user, timestamp=self.testdate, flag='block')
# User4 quits group
follow(self.user4, self.another_comment, timestamp=self.testdate, flag='quit')
Тем не менее, в unittest, follow
функция по-прежнему использовать DefaultVerbTransformer
вместо настройки переопределения TestVerbTransformer
,
В чем здесь проблема?