我正在尝试为在open
上调用pathlib.Path
方法的函数编写单元测试。我能够成功模拟open
方法而没有问题,但是很难验证函数是否具有正确的行为。请参见下面的示例代码:
def test_my_function(self):
with patch.object(Path, 'open') as mock_open:
my_function(*args) # This function calls Path.open
当我内省mock_open
并查看_mock_mock_calls
列表时,我无法找到正在写入的文件的字符串路径。通话记录如下:
[
call(mode='w'),
call().__enter__(),
call().__enter__().write('<file contents>'),
call().__enter__().flush(),
call().__exit__(None, None, None),
]
是否有一种方法可以测试调用Path.open
时正在打开的路径?
答案 0 :(得分:3)
您用模拟对象替换了方法。这里使用模拟对象的问题是它不会绑定到Path()
实例。它将被调用,但是没有返回到Path()
实例的路径(没有双关语)。
使用函数模拟open()
,该函数返回mock_open()
object以跟踪进一步的“打开文件”使用,在{的实例上访问时,将绑定 函数{1}}:
Path
现在,任何from unittest.mock import patch, mock_open
def test_my_function(self):
opener = mock_open()
def mocked_open(self, *args, **kwargs):
return opener(self, *args, **kwargs)
with patch.object(Path, 'open', mocked_open):
my_function(*args) # This function calls Path.open
调用都将调用Path().open()
模拟,记录所有文件交互和被调用的opener
对象:
Path()