Python 如何对使用环境变量的装饰器进行单元测试?
我创建了一个decorator,只允许在特定环境中运行函数: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
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
属性一起使用会让我的口腔产生不好的味道。好的,有道理:)谢谢。