with ステートメントで使用される open をモックするにはどうすればよいですか (Python の Mock フレームワークを使用)? 質問する

with ステートメントで使用される open をモックするにはどうすればよいですか (Python の Mock フレームワークを使用)? 質問する

次のコードをテストするにはどうすればいいですか?unittest.mock:

def testme(filepath):
    with open(filepath) as f:
        return f.read()

ベストアンサー1

Python3 について

パッチbuiltins.open使用してmock_openの一部であるmockフレームワーク。patchとして使用されるコンテキストマネージャーパッチを適用したオブジェクトを置き換えるために使用されるオブジェクトを返します。

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少々奇妙です。代わりにpatchnew_callable=引数を使用してください。使用しない余分な引数はすべてpatch関数に渡されることに注意してくださいnew_callablepatchドキュメンテーション:

patch()Mock任意のキーワード引数を取ります。これらは構築時に(またはnew_callable )に渡されます。

@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モック オブジェクトがテスト関数への引数として渡されることに注意してください。

Python 2

__builtin__.openの代わりにをパッチする必要がありbuiltins.openmockは の一部ではないので、を個別にインポートする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")

おすすめ記事