unittestでメソッドをMockにして、処理の置きかえでメソッドを入れるやり方をメモしておきます。
メソッドを置き換える場合は、メソッドをMockにして、そのオブジェクトの属性のside_effectに置き換えるメソッドを入れます。
下記のサンプルを参考にしてください。
テストの対象クラス
import math
class Calc:
"""
テスト対象用クラス
計算クラス
"""
def __init__(self):
self.value = 10
def tasu(self, a, b):
"""
足し算メソッド
"""
print('tasu')
return a + b
def kaijo(self, a):
return math.factorial(a)
unittestクラス
import unittest
from calc import Calc
from mock import Mock, patch
from math import factorial
class TestCalc(unittest.TestCase):
def test_tasu(self):
"""足し算 メソッドを
"""
c = Calc()
# tasuメソッドの処理を空っぽにしている。
c.tasu = Mock()
# c.tasuメソッドを、dummy_tasu_nibaiメソッドの処理に置き換える
c.tasu.side_effect = dummy_tasu_nibai
# ans => 6
ans = c.tasu(1, 2)
self.assertEqual(ans, 6)
def test_kaijo(self):
c = Calc()
with patch('math.factorial', side_effect=math_factorial_nibai):
# math.factorialメソッドをこちらで作ったメソッドに変える
# ans => 240
ans = c.kaijo(5)
self.assertEqual(ans, 240)
def dummy_tasu_nibai(a, b):
print('dummy_tasu_nibai')
return a + b + a + b
def math_factorial_nibai(a):
print('math_factorial_nibai')
return factorial(a) + factorial(a)
if __name__ == "__main__":
unittest.main()
実行結果
math_factorial_nibai .dummy_tasu_nibai -------- . ------------------------------------------------------------------------ Ran 2 tests in 0.001s OK
Calcクラスのメソッドでなく、
TestCalcクラスのモジュールで作ったメソッドが呼ばれていることがわかります。
