Python 如何对使用环境变量的装饰器进行单元测试?

Python 如何对使用环境变量的装饰器进行单元测试?,python,django,Python,Django,我创建了一个decorator,只允许在特定环境中运行函数: 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

我创建了一个decorator,只允许在特定环境中运行函数:

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")
这似乎有效,但我想对其进行单元测试。 问题是:我的测试可能在每个环境(本地、临时、产品)中运行。另外,我认为我的测试能够改变环境变量是不安全的


我应该“嘲笑”这种行为吗?你会怎么做?谢谢

使用
mock
覆盖测试的
settings.ENV_NAME

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

谢谢你的主意。mock.patch.objet不存在(我使用的是Python 3.5)。我用mock.patch(settings,ENV_NAME=“env1”)尝试了
,但是我得到了一个
AttributeError:“settings”对象没有属性“rsplit”
您正在导入第三方
mock
模块吗?不,只是Pycharm…奇怪。否则,我会得到一个
TypeError:\u patch\u object()缺少一个必需的位置参数:“attribute”
我试图在文档中找出mock需要什么:)好的,我想我已经修复了它(显然,我不记得如何正确使用
patch.object
)。我不太喜欢这个答案;我一直在想
patch.dict
,但将它与
\uu dict\uuu
属性一起使用会让我的口腔产生不好的味道。好的,有道理:)谢谢。