スポンサーリンク

[python] unittestでメソッドをMock化して別のメソッドの処理に置きかえ

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

関連記事