如何在python中修补常量

2024-05-13 03:30:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

LOGGING_ACTIVATED = False

此常数用于第二个模块(称为main),如下所示:

if LOGGING_ACTIVATED:
    amqp_connector = Connector()

在主模块的测试类中,我想用

True

不幸的是下面的方法不起作用

@patch("config.LOGGING_ACTIVATED", True)

这也不起作用:

@patch.object("config.LOGGING_ACTIVATED", True)

有人知道如何从不同的模块修补常数吗?


Tags: 模块项目configfalsetrueamqpconnectorif
1条回答
网友
1楼 · 发布于 2024-05-13 03:30:05

如果if LOGGING_ACTIVATED:测试发生在模块级别,则需要确保尚未首先导入该模块。模块级代码只运行一次(第一次在任何地方导入模块时),不能测试不会再次运行的代码。

如果测试在函数中,请注意使用的全局名称是LOGGING_ACTIVATED不是config.LOGGING_ACTIVATED。因此,您需要在这里修补main.LOGGING_ACTIVATED

@patch("main.LOGGING_ACTIVATED", True)

因为那是你想要取代的真正的参考。

另请参阅mock文档的Where to patch section

您应该考虑将模块级代码重构为更易于测试的代码。尽管您可以通过从sys.modules映射中删除模块对象来强制重新加载模块代码,但将希望可测试的代码移到函数中则更为简单。

如果你的代码现在看起来像这样:

if LOGGING_ACTIVATED:
    amqp_connector = Connector()

考虑改用函数:

def main():
    global amqp_connector
    if LOGGING_ACTIVATED:
        amqp_connector = Connector()

main()

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

相关问题 更多 >