はじめに
mock.patchを使ってクラス関数をテスト用に作成したクラス関数に置き換えたいのだが、
テスト用クラス関数のselfが通常引数扱いされ、引数の数が合わずTypeErrorが発生して詰まった。
解決したのでメモ
失敗例
test_human.py
import unittest
from unittest.mock import patch
class Human:
def set_name(self, name):
self.name = name
def get_name(self):
return self.name
class TestHuman(unittest.TestCase):
def test_human(self):
"""Human クラスの get_name を常に "しげる" を返す関数に置き換える"""
with patch('test_human.Human.get_name') as get_name_mock:
def custom_get_name(self):
return "しげる"
get_name_mock.side_effect = custom_get_name
human = Human()
human.set_name("たけし")
self.assertEqual(human.get_name(), "しげる")
if __name__ == '__main__':
unittest.main()
TypeError: get_name() missing 1 required positional argument: 'self'
成功例
autospec=Trueを設定することで、selfは本来のselfとして扱われる。
test_human.py修正後
class TestHuman(unittest.TestCase):
def test_human(self):
"""Human クラスの get_name を常に "しげる" を返す関数に置き換える"""
with patch('test_human.Human.get_name', autospec=True) as get_name_mock:
def custom_get_name(self):
return "しげる"
get_name_mock.side_effect = custom_get_name
human = Human()
human.set_name("たけし")
self.assertEqual(human.get_name(), "しげる")
Ran 1 test in 0.003s
OK