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クラスのモジュールで作ったメソッドが呼ばれていることがわかります。