Ada*_*dam 5 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
Run Code Online (Sandbox Code Playgroud)
当我进行内省mock_open和检查_mock_mock_calls列表时,无法找到要写入的文件的字符串路径。通话记录如下:
[
call(mode='w'),
call().__enter__(),
call().__enter__().write('<file contents>'),
call().__enter__().flush(),
call().__exit__(None, None, None),
]
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以测试Path.open调用时正在打开的路径?
您用模拟对象替换了一个方法。在这里使用模拟对象的问题是它不会绑定到Path()instance。它将被调用,但没有返回Path()实例的路径(没有双关语)。
使用一个函数来模拟open(),一个返回一个mock_open()对象以跟踪进一步“打开文件”使用的函数,在以下实例上访问时将绑定函数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
Run Code Online (Sandbox Code Playgroud)
现在任何Path().open()调用都会调用opener模拟,记录所有文件交互和Path()调用它的对象:
>>> from pathlib import Path
>>> from unittest.mock import patch, mock_open
>>> opener = mock_open()
>>> def mocked_open(self, *args, **kwargs):
... return opener(self, *args, **kwargs)
...
>>> with patch.object(Path, 'open', mocked_open):
... print(Path.open)
... print(Path().open)
... with Path().open() as f:
... f.write('<file contents>')
... f.flush()
...
<function mocked_open at 0x12026f5c0>
<bound method mocked_open of PosixPath('.')>
<MagicMock name='open().flush()' id='4834728928'>
>>> opener.mock_calls
[call(PosixPath('.')),
call().__enter__(),
call().write('<file contents>'),
call().flush(),
call().__exit__(None, None, None)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
220 次 |
| 最近记录: |