前提・実現したいこと
26.6.3.4. Applying the same patch to every test method
上記ドキュメントを参考に、全てのテストメソッドに同じpatchを当てた状態のインスタンスをsetUp
内で生成して、
各テストケースで利用するようなテストを書きたいと思っています。
この時にMockオブジェクトに想定のものが上手く反映されず、
どのように使ったらよいか教えてもらえませんでしょうか。
発生している問題・エラーメッセージ
setUp
内でpather.start()
で返されるMockオブジェクトに対して、
以下のように設定をした場合、patch
を当てたクラスの方では想定のMockオブジェクトではなく、
何も設定されていないMockオブジェクトが渡っているようです。
(patchを当てたいのはconfigparser.ConfigParserです)
python
1# test_hoge,py 2from unittest import TestCase, mock 3from libs.hoge import Hoge 4 5class TestHoge(TestCase): 6 7 def setUp(self): 8 pathcer = mock.patch('libs.hoge.ConfigParser') 9 self.addCleanup(pathcer.stop) 10 self.conf_mock = pathcer.start() 11 12 # この辺でMagicMockに諸々の挙動を入れたい 13 self.conf_mock.get = mock.MagicMock(side_effect=self._side_effect) 14 self.conf_mock.getboolean.return_value = False 15 self.conf_mock.getint.return_value = 5 16 17 # ↑で入れたMagicMockを使ってインスタンス化したい 18 self.hoge = Hoge() 19 20 def _side_effect(self, section, option): 21 return "{0}-{1}".format(section, option) 22 23 def test_test(self): 24 a = self.hoge 25 26 # 何かする
python
1# libs/hoge.py 2from configparser import ConfigParser 3from definitions import CONFIG_PATH 4 5class Hoge(object): 6 7 def __init__(self): 8 # このコードで実行するとMagicMockが↑で挙動を入れたものではない、新規のが入ってくるように見える 9 conf = ConfigParser() 10 conf.read(CONFIG_PATH) 11 12 self.host = conf.get('settings', 'host') 13 self.user = conf.get('settings', 'user') 14 self.pwd = conf.get('settings', 'pwd') 15 self.flag = conf.getboolean('settings', 'flag') 16 self.port = conf.getint('settings', 'port') 17 18 def nanka_method(self): 19 # ... 20
試したこと
関数に対してのpatch
は上手くできていました。
他に色々パスを変えたりなどして試してみたのですが、全てうまく行かなかった形でした。
やり方問わずテストケース全体にカジュアルにMockを当てた状態の初期化されたインスタンスを使う方法があれば、
そちらのやり方でも構いませんので教えて頂けるとありがたいです。
試したこと1
test_hoge.py
のコンストラクタ内で以下のようなコードでのMockへの値追加も試しましたが、変わらずでした
python
1# test_hoge.py:__init__ 2 ConfigParser.get = mock.MagicMock(side_effect=self._side_effect) 3 ConfigParser.getboolean.return_value = False 4 ConfigParser.getint.return_value = 5
試したこと2
関数へのMockは以下のような形でやって上手く行っていました。
python
1# test_hoge.py 2from unittest import TestCase, mock 3from libs.hoge import Hoge 4 5def _side_effect(self, section, option): 6 return "{0}-{1}".format(section, option) 7 8class TestHoge(TestCase): 9 10 @mock.patch('libs.hoge.ConfigParser.get', side_effect=_side_effect) 11 @mock.patch('libs.hoge.ConfigParser.getboolean', return_value=False) 12 @mock.patch('libs.hoge.ConfigParser.getint', return_value=5) 13 def test_test(self): 14 a = Hoge() 15 16 # 何かする
試したこと3
関数へのMockですが、この形だと上手く入りませんでした
初期化のタイミングが異なるとかなのでしょうか...?
python
1# test_hoge.py 2from unittest import TestCase, mock 3from libs.hoge import Hoge 4 5def _side_effect(self, section, option): 6 return "{0}-{1}".format(section, option) 7 8class TestHoge(TestCase): 9 10 @mock.patch('libs.hoge.ConfigParser') 11 def test_test(self, parser): 12 parser.get = mock.MagicMock(side_effect=_side_effect) 13 conf_parser.getboolean.return_value = False 14 conf_parser.getin.return_value = 5 15 16 a = Hoge() 17 18 # 何かする
補足情報(FW/ツールのバージョンなど)
- PyCharm CE 2016.3
- Python 3.6.5
- macOS Sierra 10.12.6
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/09 02:42