如何为特定文件mock pathlib.Path.read_text方法?
如何Mock pathlib.Path的read_text方法?
Python官方unittest文档里的mock_open可以直接mock对builtins.open的直接调用,但面对pathlib.Path.read_text()时,直接套用文档方案会失效。比如这段目标代码:
import pathlib pathlib.Path("/path/to/file").read_text()
下面提供两种可行的Mock方案:
方案1:直接Mock read_text方法
这是最直观的方式,无需关心底层实现,直接patchpathlib.Path的read_text方法:
from unittest.mock import patch import pathlib def test_pathlib_read_text(): with patch.object(pathlib.Path, 'read_text', return_value='模拟的文件内容') as mock_read: content = pathlib.Path('/path/to/file').read_text() # 验证返回内容 assert content == '模拟的文件内容' # 验证方法被调用一次 mock_read.assert_called_once()
方案2:Mock pathlib内部引用的open
如果一定要从底层open入手,需要明确:pathlib模块在导入时已经将builtins.open绑定到自身命名空间中,因此直接patch全局的builtins.open不会影响它的内部调用,必须patchpathlib模块内的open引用:
from unittest.mock import mock_open, patch import pathlib def test_pathlib_through_open(): with patch('pathlib.open', mock_open(read_data='模拟的文件内容')) as mock_file: content = pathlib.Path('/path/to/file').read_text() assert content == '模拟的文件内容' # 验证open被正确调用,参数符合预期 mock_file.assert_called_once_with('/path/to/file', mode='r', encoding=None, errors=None)
为什么直接patch builtins.open无效?
Python模块的导入是静态绑定的,pathlib在加载时就把builtins.open的引用存到了自己的模块命名空间里,后续调用read_text时用的是这个本地引用,而非全局的builtins.open,所以全局patch不会生效。
内容的提问来源于stack exchange,提问作者LondonRob
相关产品推荐
相关产品推荐

