Python单元测试:模拟开放特定路径(不要模拟其他路径)

Python单元测试:模拟开放特定路径(不要模拟其他路径),python,unit-testing,python-unittest,Python,Unit Testing,Python Unittest,用例是我想模拟打开两个文件~/.myconf和/.myconf,但不模拟其他文件 我正在测试一个复杂对象的设置,该对象在其\uuuu init\uuuu中读取多个文件,因此我想为其中一些对象模拟一些数据,而不是为其他一些对象模拟 举个例子,我是如何模拟有条件地打开这两个文件的,但这感觉很复杂,而且我觉得奇怪的是,没有一个简单的方法已经内置了,我错过了 导入内置项 导入配置分析器 导入单元测试 从textwrap导入dedent 从pathlib导入路径 从unittest.mock导入mock_

用例是我想模拟打开两个文件
~/.myconf
/.myconf
,但不模拟其他文件

我正在测试一个复杂对象的设置,该对象在其
\uuuu init\uuuu
中读取多个文件,因此我想为其中一些对象模拟一些数据,而不是为其他一些对象模拟

举个例子,我是如何模拟有条件地打开这两个文件的,但这感觉很复杂,而且我觉得奇怪的是,没有一个简单的方法已经内置了,我错过了

导入内置项
导入配置分析器
导入单元测试
从textwrap导入dedent
从pathlib导入路径
从unittest.mock导入mock_open
打开=内置。打开
def get_hierarchical_config():
cwd=Path.cwd()
全局_config=configparser.configparser()
local\u config=configparser.configparser()
全局_config.read(路径(“~/.myconf”).expanduser().resolve())
local_config.read((cwd/“.myconf”).expanduser().resolve())
完整配置。读取目录(全局配置)
完整配置。读取目录(本地配置)
返回完整配置[“mysection”]
def get_custom_mock_open(全局配置、本地配置)->可调用:
def mock_open():
定义条件函数(路径,*args,**kwargs):
p=Path(Path).expanduser().resolve()
如果p.name==“.myconfig”:
如果p.parent==Path.home():
返回mock_open(read_data=global_conf_str)()
返回mock_open(read_data=local_conf_str)()
返回打开(路径,*args,**kwargs)
返回条件函数
返回mock_open
[...]
类TestConfig(unittest.TestCase):
def测试读取会话(自):
全局配置=dedent(
"""\
[我的部分]
无覆盖=路径/到/某处
本地覆盖=错误:未覆盖
语法测试键=否/空格=问题2
"""
)
本地配置=dedent(
"""\
[我的部分]
本地覆盖=成功:覆盖
本地\新\键=冷值
"""
)
带补丁(
“内置,打开”,
new_callable=get_custom_mock_open(全局配置、本地配置),
):
conf=dict(get_hierarchical_config())35;读取配置文件
目标={
“无覆盖”:“路径/目的地/某处”,
“本地覆盖”:“成功:覆盖”,
“syntax\u test\u key”:“no/space=problem2”,
“本地新密钥”:“酷值”,
}
self.assertDictEqual(配置,目标)

您检查过了吗?正如您在我共享的代码中看到的,我检查过了,但它不是以文件名为条件的,是吗?啊,很抱歉,出于某种原因错过了。不,我认为没有比这更好的东西了。如果您想大量伪造文件系统,您可以使用(免责声明:我是一名贡献者),但在您的情况下,这可能是矫枉过正。