LoginSignup
2
2

More than 3 years have passed since last update.

Pythonのunittestモジュールでモックに返り値を設定する(return_value, side_effect)

Last updated at Posted at 2021-04-10

環境

  • macOS
  • Python 3.9.4

※IMO=In my opinion(コメントがあればぜひお願いします)

IMO: ざっくり整理

  • モックを呼び出したときに(毎回同じ返り値を返してほしい場合はreturn_value属性を設定する
  • モックを呼び出すたびに異なる返り値を返してほしい場合はside_effect属性にイテラブルを渡す

実行例

>>> from unittest.mock import Mock
>>> m1 = Mock()
>>> m1.return_value = 108
>>> m1()
108
>>> m1()
108
>>> m2 = Mock()
>>> m2.side_effect = [1, 2, 3]
>>> m2()
1
>>> m2()
2
>>> m2()
3
>>> # m2()  # raise StopIteration

利用シーンのイメージ

IMO:モックのreturn_valueside_effectは、patchでモジュールに当てたモックについてよく設定します。

ref: https://docs.python.org/ja/3/library/unittest.mock.html#unittest.mock.patch

return_value

import random
from unittest.mock import patch

with patch("random.choice") as mock_choice:
    mock_choice.return_value = 2  # withブロックの中では2しか返らなくなります
    for i in range(5):
        print(random.choice([1, 2, 3, 4, 5]))

上のスクリプトを実行したときのコマンドライン

2
2
2
2
2

side_effect

import random
from unittest.mock import patch

with patch("random.choice") as mock_choice:
    mock_choice.side_effect = (1, 1, 2, 3, 5)
    for i in range(5):
        print(random.choice([1, 2, 3, 4, 5]))

上のスクリプトを実行したときのコマンドライン

1
1
2
3
5

例えばfor文で繰り返す処理の中のモックのside_effectを使って、for文が回ったあとの値を設定できます。

補足事項

モック生成時にも設定可能

>>> m1 = Mock(return_value = 108)
>>> m2 = Mock(side_effect = [1, 2, 3])

ref: https://docs.python.org/ja/3/library/unittest.mock.html#unittest.mock.Mock.return_value

side_effectは関数や例外も設定できる

このモックが呼ばれた際に呼び出される関数、イテラブル、もしくは発生させる例外 (クラスまたはインスタンス) を設定できます。

イテラブルの設定は、1つの使い方に過ぎません。

モックを呼び出した返り値はreturn_value属性と一致

>>> from unittest.mock import Mock
>>> m = Mock()
>>> m()  # doctest: +ELLIPSIS
<Mock name='mock()' id=...>
>>> m.return_value  # doctest: +ELLIPSIS
<Mock name='mock()' id=...>
>>> m() is m.return_value
True

isTrue(idが同じ)なので、同一のオブジェクトです。

IMO:使い分け方針

  • モックを呼び出したときの返り値が具体的でなくてもよい場合、m.return_valueを使う
  • 具体的な返り値が必要な場合はm.return_value = ...と設定

参考資料

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