現在、複数のレイヤー/ネストされた戻り値をモックする良い方法を見つけるのに苦労しています。言い換えれば、私は魔法のモックを返したいと思っています。それは、それ自身のセット戻り値で魔法のモックを返します。私はこれを比較的厄介で、よりエレガントで維持しやすい解決策を探しています。Pythonでネスト/リターンオブジェクトの複数のレイヤーを模擬する方法
次のコードを効率的にテストしようとしています。すべて、最後に
class MyTestCase(TestCase):
@patch('load_json_path.urlopen')
def test_load_json(self, mock_urlopen):
### trying to simplify all of this
# third nested return
mock_decode = MagicMock(return_value='["myjsondata"]')
# second nested return value
mock_response = MagicMock()
mock_response.read.return_value=mock_decode
# first nested return value
mock_urlopen.return_value = mock_response
### trying to simplify all of this
load_json()
:
import json
from urllib.request import url open
def load_json():
# first return value
response = urlopen("http://someurl.com/api/getjson")
# in turn, contains two nested return values for read and decode
response_dict = json.loads(response.read().decode('utf-8'))
は、これは私がメンテナンスが煩雑に非常に洗練された、これまでのところ、これを嘲笑して行いました方法です:URLは、さらなる処理を必要とするJSON文字列を返します。私は模擬しようとしているデコード関数から返されたデータは、URLのオープン関数から発生します。 の方法を使用して、これは1行またはより簡単な方法で行うことができます。 理想的にはモックがtest_load_json機能で次のようになります。
mock_urlopen.__enter__.loads.__enter__.decode.return_value = '["myjsondata"]'
残念ながら、私はモックドキュメントに有用何かを見つけるように見えることはできません。どんな助けもありがたい。
まあ、私は「美しく」言わないだろう... –