gpt4 book ai didi

python - 如何在python中修补常量

转载 作者:IT老高 更新时间:2023-10-28 20:39:51 25 4
gpt4 key购买 nike

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

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_ACTIVATEDnot config.LOGGING_ACTIVATED。因此,您需要在此处修补 main.LOGGING_ACTIVATED:

@patch("main.LOGGING_ACTIVATED", True)

因为这是您要替换的实际引用。

另见 Where to patch section mock 文档。

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

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

if LOGGING_ACTIVATED:
amqp_connector = Connector()

考虑改用函数:

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

main()

或者生成一个带有属性的对象。

关于python - 如何在python中修补常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27252840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com