模拟/测试对Path.open的调用

时间:2019-03-14 14:39:46

标签: python mocking pathlib

我正在尝试为在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时正在打开的路径?

1 个答案:

答案 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()