python:模拟模块

标签 python mocking

是否可以使用 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/

相关文章:

python - 使用 jQuery 从 Web 服务器获取数据

python - 如何修复与Gmail建立网络时的错误以及如何创建电子邮件发件人? - Python

c# - 数据访问层c#的单元测试

c# - 单元测试和数据库

java - 如何捕获 HTTP 请求并在 Java 中模拟其响应?

python - 如何从 Outlook 获取所有日期相关信息(Python、win32)

python - 检查字典中是否存在键列表

python - 计算Python pandas中的系列数

database - 对数据库驱动的应用程序进行单元测试的最佳策略是什么?

c# - 如何模拟 System.DirectoryServices.SearchResult?