在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中文網其他相關文章!