#はじめに
unittest.mockのpatchメソッドではmockのresponseを送信することはみなん知っていると思いますが、しかし、請求URLなどより動的にmock responseを作ることはどう実現できるでしょうか?この記事ではそれを実現するための方法を紹介します。
#return_valueとside_effect
簡単にまとめる、こんな感じ:
- モックを呼び出したときに(毎回同じ)返り値を返してほしい場合はreturn_value属性を設定する。
- モックを呼び出すたびに異なる返り値を返してほしい場合はside_effect属性に渡す。
今回は可変な返り値を返してほしいのでside_effect属性を利用します。
#コード例
import json
from unittest.mock import patch
from requests import Response
def mocked_request_get(*args, **kwargs):
response_content = None
request_url = kwargs.get('url')
if request_url == 'aurl':
response_content = json.dumps('a response')
elif request_url == 'burl':
response_content = json.dumps('b response')
elif request_url == 'curl':
response_content = json.dumps('c response')
response = Response()
response.status_code = 200
response.content = str.encode(response_content)
return response
@patch('requests.get', side_effect=mocked_requests_get)
ここに注意すべきなのはkwargs.get('url')のところ請求requestによりコードを変わる必要があります。以上のようなmocked_request_getで請求requestより違うresponseを作成し、patchメソッドのside_effect属性を利用して、mockのresponseを作ることができます。