在 Python Unittest.Mock 中模拟打开文件
在测试使用文件操作的 Python 代码时,有效地模拟打开文件的行为至关重要。在 with 语句中使用 open 时会出现一种特定情况,如以下代码所示:
<code class="python">def testme(filepath): with open(filepath) as f: return f.read()</code>
Python 3
要模拟此 open 操作,请使用unittest.mock 与mock_open 结合使用,它是mock 框架的一部分。 patch 充当上下文管理器,返回用于替换修补对象的对象:
<code class="python">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")</code>
或者,patch 也可以用作装饰器。然而,使用mock_open()的结果作为新参数可能会很麻烦。相反,请利用 patch 的 new_callable 参数,并记住 patch 未使用的其他参数将传递给 new_callable 函数:
<code class="python">@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")</code>
请注意,在此实例中,patch 将提供模拟对象作为测试函数的参数.
Python 2
对于 Python 2,需要修补 __builtin__.open 并单独导入模拟:
<code class="python">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")</code>
以上是如何在 Python Unittest.Mock 中模拟打开的文件?的详细内容。更多信息请关注PHP中文网其他相关文章!