【发布时间】:2022-01-22 05:58:53
【问题描述】:
我在一个类方法中有以下上下文管理器,我想模拟它以进行单元测试。
def load_yaml_config(self) -> dict:
"""
Load the config based on the arguments provided.
Returns: dict
dictionary which will be used for configuring the logger, handlers, etc.
"""
with open(self.yaml_path, 'r') as config_yaml:
return yaml.safe_load(config_yaml.read())
我怎样才能实现它?
编辑:
正如@chepner 所建议的(我不能接受他/她的回答,因为它是通过评论),最好的方法似乎是使用 unittest 的 mock_open 功能。
这样,我可以简单地走了:
import unittest.mock as um
with um.patch('builtins.open', um.mock_open(read_data=YAML_TEST)):
h = MyClass.load_yaml_config()
【问题讨论】:
-
两个选项:补丁
open,或者写一个带有测试数据的临时文件并将yaml_path指向它。我个人可能会选择后者,因为将测试数据写入文件比模拟文件对象更容易。 -
@Samwise 您能否将其发布在答案中,以便我更容易理解这个概念?
-
这是您的 IDE 发出警告,而不是 Python 本身。你可以忽略它,或者使用docs.python.org/3/library/unittest.mock.html#mock-open。
-
您希望测试实际测试什么?您的
mocked_yaml测试函数甚至不会调用您的load_yaml_config函数。您是否要测试load_yaml_config、yaml.safe_load,两者都不测试...? -
我只想测试 load_yaml_config。 @Samwise
标签: python unit-testing mocking contextmanager