質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2712閲覧

[Python3] unittestのpatchで、クラスのインスタンス変数から呼び出されるメソッド1つだけをmockに置き換えたい

siruku6

総合スコア1382

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/04/19 12:26

困っていること

タイトルの通りです。
ソースコードを見た方がわかりやすいかと思いますので、ソースコードを掲載します。

python

1# app_name/mymodule/hoge.py 2from mymodule.operation import Operation 3class Hoge(): 4 def __init__(self): 5 # インスタンス変数 6 self._client = Operation() 7 8 def public_method(self): 9 # 外部APIと通信して結果を返却する処理 10 # このrequest_operation_method()だけをmockで置き替えたい 11 result = self._client.request_operation_method() 12 13 # ここでresultをごちゃごちゃといじる 14 # この「いじる」処理が期待通りに行われているかをテストしたい 15 return result

python

1# app_name/tests/some_test.py 2import unittest 3from unittest.mock import patch 4import mymodule.hoge as hoge 5 6class TestHoge(unittest.TestCase): 7 def setUp(self): 8 self.hoge = hoge.Hoge() 9 10 def test__public_method(self): 11 with patch('ここに何を書いたらいいかわからない') as mock: 12 mock.return_value = 'hoge' 13 result = self.hoge.public_method() 14 self.assertEqual(result, 'hoge', '両方hoge')

困っていること 文章.ver

たぶん読んでも意味が分からないかと思いますが、一応文字にもしておきます。
たぶん、上記ソースコードを見た方がわかりやすいと思います...。


前提

あるHogeクラスのインスタンス変数に、他のクラス(Operationクラス)のインスタンスを作成・代入しています。

この、Operationクラスのインスタンスが代入されているHogeクラスのインスタンス変数は、他のインスタンスメソッド(public_method)内で利用されています。

やりたいこと

このとき、public_methodの単体テストをしたいのですが、public_method内で呼び出しているself._client.request_operation_method()というメソッドは、外部サービスAPIにリクエストを行う処理であるため、mock化したいと考えています。

mock化するためにunittestのpatchが使えると知ったのですが、今回の「やりたいこと」を達成するためにはどのようにpatch()メソッドの引数を指定したらよいのでしょうか?

補足

どうしてもできないようであれば、request_operation_method()ではなく、_clientごとmock化しても構わないと考えています。

ただし、Hoge()クラスのインスタンス自体をmock化してしまうと、そのインスタンスメソッドを呼んでテストすることができなくなってしまうので、これはダメなようです(これはやってみたところダメでした)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ごめんなさい、環境を作るのは手間なので推測です。'mymodule.operation.Operation.request_operation_method' ではダメでしょうか。

投稿2019/04/19 12:37

iwamot

総合スコア1154

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siruku6

2019/04/19 23:46

ありがとうございます!まだ試したことのないパターンなので早速試してみます!! 結果わかり次第報告させていただきますね。
siruku6

2019/04/19 23:59

できました!!!! 私は初めてmockを使ったのですが、実際に動作させなくても何を書けばよいかがわかることに純粋に驚いています。 iwamotさんのようにpythonでも一発で回答ができるように、私も経験を積んでいきたいと思います。
iwamot

2019/04/20 01:47

よかったです。たまたま仕事で使ったことがあり、そのときの記憶を頼りに書きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問