Python でモックを使用して With ステートメントのオープン ハンドルをモックする
with ステートメントとファイル操作を利用するコードの単体テストを作成する場合、テストされたコードの動作を分離するには、開いているハンドルをモックすることが必要になります。 Python の Mock フレームワークを使用してこれを実現する方法は次のとおりです。
Python 3
unittest.mock モジュールを使用すると、open などの組み込み関数にパッチを適用できます。その方法は次のとおりです。
<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>
Python 2
Python 2 では、構文が若干異なります。 builtins.open にパッチを適用する代わりに、__builtin__.open にパッチを適用し、モックを個別にインポートする必要があります。
<code class="python">import mock with mock.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>
Decorator によるパッチ
パッチを使用することもできます。よりクリーンな構文のためのデコレータ。ただし、mock_open の結果を patch の new= 引数で直接使用するのは難しい場合があります。代わりに、ドキュメントで説明されているように 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>
注: この場合、パッチ適用されたオブジェクトが引数としてテストに渡されることに注意してください。関数。
以上がPython でモックを使用して「with」ステートメントの「open」ハンドルをモックする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。