この記事は、ニフティグループ Advent Calendar 2025 20日目の記事です。
はじめに
こんにちは。ニフティの並木です。
今回は、Pythonのpatch.objectについてご紹介します。
| ・本記事の動作確認環境:Python 3.13 ・公式ドキュメント:https://docs.python.org/ja/3.13/library/unittest.mock.html |
patch.objectとは
patch.object は、Pythonのオブジェクト(インスタンスやクラス)の一部を、一時的にモックに置き換える機能で、テストの時に活用することができます。
具体的なテストコードを見ていきます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import unittest from unittest.mock import patch # テスト対象のクラス(実際の開発では別ファイルにある想定) class FileManager: def _get_latest_record(self): """DBにアクセスして最新のファイル名を取得する複雑なメソッド""" # 中身は省略 pass def generate_file_name(self): """新しいファイル名を生成するメソッド""" latest = self._get_latest_record() if latest is None: return "file001.csv" return f"file_{latest}.csv" # テストコード class TestFileManager(unittest.TestCase): def test_generate_file_name_when_db_is_empty(self): """DBにレコードがない(Noneが返る)場合の挙動を確認するテスト""" file_mgr = FileManager() # _get_latest_record が None を返すように一時的に置き換える with patch.object(file_mgr, '_get_latest_record', return_value=None): # 内部で _get_latest_record が呼ばれる result = file_mgr.generate_file_name() # 検証 self.assertEqual(result, "file001.csv") if __name__ == "__main__": unittest.main() |
本来、_get_latest_record というメソッドは、実際にDB見に行って「最後に保存されたファイル名」を探してくる複雑な処理を行っています。
しかし、今回のテストでやりたいことは「DBに該当レコードが無い時の挙動」を確かめることです。
実際にDBを空にするのは大変ですし、他のテストに影響が出てくるかもしれません。
そこで、patch.object を使い「このテストの間だけ、_get_latest_record は何も考えずに None を返すようにして」 と命令しているのです。
with ブロックを使っている理由は、「テストが終わったら、_get_latest_record をモックオブジェクトから、本物に戻すため」 です。with ブロックを抜けると、モックオブジェクトに置き換わっていたメソッドが、自動的に元の本物のメソッドへと戻されます。
patch.object の書き方
|
1 |
with patch.object(対象のオブジェクト, "メソッド名などの文字列", return_value=返り値): |
- 第1引数 : ターゲットとなるインスタンスそのものを渡します。今回はインスタンスを渡していますが、クラスを渡すこともできます。
- 第2引数 : 置き換えたいメソッドの名前を「文字列」で指定します。メソッド名を打ち間違えても、実行するまでエラーに気づきにくいため注意が必要です。
return_value: そのメソッドが呼ばれたときに、何を返してほしいかを指定します。上の例ではNoneを設定していました。
おわりに
Pythonのpatch.objectについてご紹介しました。
テストコード作成の際にぜひ利用してみてください。
また、デコレータを使ってモックオブジェクトを作る方法もあるそうです。機会があればこちらも使ってみたいと思います。
※公式ドキュメント:https://docs.python.org/ja/3.13/library/unittest.mock-examples.html#patch-decorators
明日は、nemu_nemu_musashi さんの「デスクトップマスコットを作りたい」です。お楽しみに!


