是否可以使用 unittest.mock
在 python 中模拟模块?我有一个名为 config
的模块,在运行测试时我想通过另一个模块 test_config
来模拟它。我怎样才能做到这一点 ?谢谢。
配置.py:
CONF_VAR1 = "VAR1"
CONF_VAR2 = "VAR2"
test_config.py:
CONF_VAR1 = "test_VAR1"
CONF_VAR2 = "test_VAR2"
所有其他模块都从 config
模块读取配置变量。运行测试时,我希望它们从 test_config
模块读取配置变量。
最佳答案
如果您总是像这样访问 config.py 中的变量:
import config
...
config.VAR1
您可以替换由您实际尝试测试的任何模块导入的 config
模块。因此,如果您正在测试一个名为 foo
的模块,并且它导入并使用 config
,您可以说:
from mock import patch
import foo
import config_test
....
with patch('foo.config', new=config_test):
foo.whatever()
但这实际上并没有全局替换模块,它只是在 foo
模块的命名空间内替换它。因此,您需要在导入的所有地方对其进行修补。如果 foo
执行此操作而不是 import config
,它也不会工作:
from config import VAR1
您还可以使用 sys.modules
来执行此操作:
import config_test
import sys
sys.modules["config"] = config_test
# import modules that uses "import config" here, and they'll actually get config_test
但一般来说,乱搞 sys.modules
并不是一个好主意,而且我认为这种情况也没有什么不同。我赞成所有其他建议。
关于python:模拟模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57232776/