如何在python中修补常量

我的项目中有两个不同的模块.一个是包含的配置文件

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()

或者生成具有属性的对象.

上一篇:odoo12从零开始:二、个性化定制odoo12 之 创建数据库页面


下一篇:Angular 2 中的 ViewChild 和 ViewChildren