2016-10-25 2 views
1

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

def accepted_environments(*envs): 
    """ 
    The decorated function can be executed only in specified envs 
    """ 
    def my_decorator(func_to_be_decorated): 
     def wrapper(): 
      if settings.ENV_NAME not in envs: 
       raise EnvironmentException 
      return func_to_be_decorated() 
     return wrapper 
    return my_decorator 

# Usage example 
@accepted_environments('local', 'prod') 
def hello(): 
    print("hello") 

Это похоже на работу, но я хотел бы модульное тестирование его. Проблема в том, что мои тесты потенциально выполняются в каждой среде (локальная, промежуточная, prod). Плюс, я думаю, что это не безопасно, мои тесты могут изменять переменные среды.

Должен ли я «издеваться» над этим поведением? Как бы вы поступили? Благодаря!

ответ

3

Используйте mock, чтобы переопределить значение settings.ENV_NAME для испытания.

def test_not_in_dev(self): 
    with mock.patch.dict(settings.__dict__, ENV_NAME="dev"): 
     self.assertRaises(EnvironmentException, hello) 
+0

Спасибо за идею. mock.patch.objet не существует (я использую Python 3.5). Я пытался с помощью 'с mock.patch (настройки, ENV_NAME =" env1 ")', но я получаю объект AttributeError: 'Settings' не имеет атрибута 'rsplit'' –

+0

Вы импортируете сторонний модуль 'mock'? https://docs.python.org/3/library/unittest.mock.html#patch-object – chepner

+0

Нет, это просто Pycharm..weird. В противном случае я получаю 'TypeError: _patch_object() отсутствующий 1 обязательный позиционный аргумент: 'attribute'' Я пытаюсь выяснить в докторе, какой макет нужен :) –

Смежные вопросы