我的项目中有两个不同的模块.一个是包含的配置文件
LOGGING_ACTIVATED = False
这个常量用在第二个模块中(让我们称之为main),如下所示:
if LOGGING_ACTIVATED:
amqp_connector = Connector()
在我的主模块的测试类中,我想用该值修补此常量
True
不幸的是,以下不起作用
@patch("config.LOGGING_ACTIVATED", True)
这也不起作用:
@patch.object("config.LOGGING_ACTIVATED", True)
有人知道如何修补不同模块的常量吗?
解决方法:
如果if LOGGING_ACTIVATED:测试在模块级别进行,则需要确保该模块尚未先导入.模块级代码只运行一次(第一次将模块导入任何地方),您无法测试不会再次运行的代码.
如果测试在函数中,请注意使用的全局名称是LOGGING_ACTIVATED,而不是config.LOGGING_ACTIVATED.因此,您需要在此处修补main.LOGGING_ACTIVATED:
@patch("main.LOGGING_ACTIVATED", True)
因为这是你想要替换的实际参考.
另请参阅模拟文档的Where to patch section.
您应该考虑将模块级代码重构为更可测试的代码.虽然您可以通过从sys.modules映射中删除模块对象来强制重新加载模块代码,但将要测试的代码移动到函数中会更简洁.
因此,如果您的代码现在看起来像这样:
if LOGGING_ACTIVATED:
amqp_connector = Connector()
考虑使用函数代替:
def main():
global amqp_connector
if LOGGING_ACTIVATED:
amqp_connector = Connector()
main()
或者生成具有属性的对象.