Python で開いているファイルをモックする Unittest.Mock
ファイル操作を利用する Python コードをテストする場合、開いているファイルの動作を効果的にモックすることが不可欠です。次のコードに示すように、with ステートメント内で open が使用される場合、1 つの特定のシナリオが発生します。
<code class="python">def testme(filepath): with open(filepath) as f: return f.read()</code>
Python 3
この open 操作を模擬するには、次のコードを使用します。モックフレームワークの一部であるmock_openと組み合わせたunittest.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 中国語 Web サイトの他の関連記事を参照してください。