2
2

More than 3 years have passed since last update.

【python】mock.patchでクラス関数を置き換える際にselfパラメータが通常引数扱いとなる

Last updated at Posted at 2020-02-05

はじめに

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
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2