概要
- 自作クラスに対して、
unittest.mock.MagicMock
を使ってモックを作成してテストする。
サンプルコード(挨拶を返すプログラムとテストコード)
(テストしたいファイル。ランダムで挨拶の語を選んで、挨拶文を返す)
# greeting.py
import random
class Greeting():
def greeting_phrase(self, name):
grt = self.greeting_word()
result = f'{grt}! {name}.'
print(result)
return result
def greeting_word(self):
grt = ['Hello', 'Bonjour', 'Konnichiwa']
i = random.randint(0, len(grt) - 1)
return grt[i]
if __name__ == '__main__':
g = Greeting()
g.greeting_phrase('tanaka')
# 「Hello! tanaka.」 「Bonjour! tanaka.」 「Konnichiwa! tanaka.」 のどれかが返る
(テストコード。unittest.mock.MagicMockを使ってモックを作成してテストする)
# test_greeting.py
from unittest import TestCase
from unittest.mock import patch, MagicMock
from greeting import Greeting
class TestGreeting(TestCase):
def test_greeting_phrase(self):
grt_mock = MagicMock()
grt_mock.return_value = 'Hi' # 挨拶の語を「Hi」に置き換える
with patch('greeting.Greeting.greeting_word', grt_mock):
g = Greeting()
actual = 'Hi! yamada.'
self.assertEqual(g.greeting_phrase('yamada'), actual)
補足
- 自作クラスのメソッドを置き換える場合、単にメソッド名だけでなく、長い名前でフルで指定する。
- 別フォルダ内にある.pyファイルに書かれているクラスをテストする場合に注意が必要。
- クラス名など命名規則は
PEP8
をよく読む。
参考
- 公式ドキュメントのunittest.mock.MagicMock
- PEP8