如何使用 unittest.mock
测试以下代码:
def testme(filepath):
with open(filepath) as f:
return f.read()
最佳答案
补丁 builtins.open
并使用 mock_open
,它是 mock
的一部分框架。 patch
用作 context manager返回用于替换修补对象的对象:
from unittest.mock import patch, mock_open
with patch("builtins.open", mock_open(read_data="data")) as mock_file:
assert open("path/to/open").read() == "data"
mock_file.assert_called_with("path/to/open")
如果你想使用 patch
作为装饰器,使用 mock_open()
的结果作为 new=
参数到 补丁
可能有点奇怪。相反,使用 patch
的 new_callable=
参数并记住 patch
不使用的每个额外参数都将传递给 new_callable
函数,如 patch
documentation 中所述:
patch()
takes arbitrary keyword arguments. These will be passed to theMock
(or new_callable) on construction.
@patch("builtins.open", new_callable=mock_open, read_data="data")
def test_patch(mock_file):
assert open("path/to/open").read() == "data"
mock_file.assert_called_with("path/to/open")
请记住,在这种情况下,patch
会将模拟对象作为参数传递给您的测试函数。
您需要修补 __builtin__.open
而不是 builtins.open
并且 mock
不是 unittest
的一部分,需要pip install
单独导入:
from mock import patch, mock_open
with patch("__builtin__.open", mock_open(read_data="data")) as mock_file:
assert open("path/to/open").read() == "data"
mock_file.assert_called_with("path/to/open")
关于python - 如何模拟在 with 语句中使用的 open (使用 Python 中的 Mock 框架)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1289894/