python - 如何使用 patch() 模拟返回值的属性和属性
问题描述
test_client/wclient.py
import json
import requests
client = requests.session()
def setup():
response = REST_CLIENT.post(
"https://placeholder.com",
auth=(placeholder, placeholder),
data={"grant_type": "client_credentials"},
)
status_code = response.status_code
if status_code in OK_STATUS:
payload = json.loads(response.content, object_pairs_hook=OrderedDict)
else:
payload = response.text
msg = (
"Status Code %s" % status_code
)
logger.error(msg)
raise ValueError(msg)
return payload["access_token"]
测试文件:test_client/test_client.py
import mock
import wclient
@mock.patch("test_client.wclient")
def test_taxes_pitney_bowes_setup_success(resp):
resp.return_value.post.return_value.status_code = "200"
wclient.pitney_bowes_setup()
Status Code <MagicMock name='REST_CLIENT.post().status_code' id='4868492200'>
如何使用 mock.patch() 模拟模块的方法和属性?我已经阅读了堆栈溢出帖子的页面,但我对执行魔术模拟的所有不同方式感到困惑。
我试过嘲笑:
resp.return_value.post.return_value.status_code
resp.return_value.post.return_value.status_code.return_value
resp.post.return_value.status_code
resp.post.return_value.status_code.return_value
resp.post.status_code
resp.post.status_code.return_value
解决方案
我认为实际进行模拟的方法有很多(请参阅Mocking Method Calls In Python中的许多方法)。我喜欢这样做并容易找到简单模拟的方式是:
对于函数:
@patch('module.print', lambda x: None)
对于属性:
@patch('module.cwd', os.path.join(os.getcwd(), "folder"))
这篇博文可能对您有所帮助:https ://medium.com/ukey/how-mock-patch-decorator-works-in-python-37acd8b78ae 。
如果您有更多问题,请告诉我。
编辑:要添加多个模拟,只需添加另一个属性:
import wclient
@mock.patch("test_client.wclient")
@mock.patch("another_attribute", "value")
@mock.patch("another_function", lambda x, y: x + y)
def test_taxes_pitney_bowes_setup_success(resp):
resp.return_value.post.return_value.status_code = "200"
wclient.pitney_bowes_setup()
推荐阅读
- sql-server - 在 Azure 中的 Docker 中运行 SQL Server 的最佳方式
- android - 更新鲜的 Kotlin : 在改造 kotlin 中发送正文中的数据
- c - 用 keyNumber 拉出数据
- swift - Swift for iOS - 2 for 循环同时运行?
- sublimetext3 - 在 Sublime 3 中保存文件后如何运行 shell 命令
- javascript - 从每个选择中获取价值
- sql - NetSuite Saved Search 公式用于过滤在某个阶段停留超过 60 天的 Opps
- spring-boot - doReturn 的值未使用
- c++ - 如何转换 std::function
void* 在 pthread_create() - android - 在我的应用程序中从 firebase 检索数据并手动上传数据