Настройки переопределения не работают в модульных тестах, когда динамический импорт класса из настроек 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,

В чем здесь проблема?

0 ответов

Другие вопросы по тегам