gpt4 book ai didi

python - 如何在 python 中模拟嵌套/多层返回对象

转载 作者:太空狗 更新时间:2023-10-29 18:16:38 26 4
gpt4 key购买 nike

我目前正在努力寻找一种模拟多层/嵌套返回值的好方法。换句话说,我想返回一个魔术模拟,它又返回一个带有自己设置的返回值的魔术模拟。我发现这相对麻烦,正在寻找更优雅和可维护的解决方案。

我正在尝试有效地测试以下代码。 URL 返回一个需要进一步处理的 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'))

到目前为止,我就是这样 mock 它的,这非常不优雅并且使维护变得复杂:

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()

最后,我要模拟的只是来自 decode 函数的返回数据,这些数据源自 url 打开函数。这应该可以在一行中或以更简单的方式实现,也许可以使用 enter 方法。理想情况下,模拟在 test_load_json 函数中看起来像这样:

mock_urlopen.__enter__.loads.__enter__.decode.return_value = '["myjsondata"]'

不幸的是,我似乎无法在模拟文档中找到任何有用的信息。任何帮助表示赞赏。

最佳答案

事实证明,这很容易实现并记录在案。然而,命名并不简单,需要知道一个人在寻找什么。所指的 mocking 是链式调用,它们实际上记录在 mock 库中。

在此示例中,mock_urlopen 应如下所示:

    mock_urlopen.return_value.read.return_value.decode.return_value = '["myjsondata"]'

这很好用。有关详细信息,请查看 python 文档:https://docs.python.org/3/library/unittest.mock-examples.html#mocking-chained-calls

关于python - 如何在 python 中模拟嵌套/多层返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39457108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com