You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单元测试中如何断言mock_post第一个POST请求的URL为google.com?

解决mock两次POST请求的断言问题

你遇到的问题是因为对mock_calls的结构理解有误,咱们一步步来解决:

方法一:用call_args_list直接获取调用参数(推荐)

mock对象的call_args_list属性会按调用顺序返回所有调用的参数元组,每个元组包含(位置参数, 关键字参数),非常适合断言多次调用的场景。

修改你的测试代码如下:

@patch('requests.post')
def send_e2e_kafka_with_env_vars(mock_post, expect, monkeypatch):
    # 确保message变量已被正确定义或mock
    send_posts()
    
    # 获取第一次调用的参数
    first_args, first_kwargs = mock_post.call_args_list[0]
    # 断言URL
    assert first_kwargs['url'] == 'google.com'
    
    # 也可以顺便断言第二次调用的URL
    second_args, second_kwargs = mock_post.call_args_list[1]
    assert second_kwargs['url'] == 'apple.com'

方法二:用mock_calls结合属性访问

如果你坚持用mock_calls,注意每个调用项是一个Call对象,它的kwargs属性直接存储关键字参数:

@patch('requests.post')
def send_e2e_kafka_with_env_vars(mock_post, expect, monkeypatch):
    send_posts()
    
    my_first_call = mock_post.mock_calls[0]
    # 直接访问kwargs属性获取URL
    assert my_first_call.kwargs['url'] == 'google.com'

方法三:用assert_any_call直接断言调用(更简洁)

如果只需要验证某次调用是否符合预期,可以用assert_any_call,它会检查mock是否有过符合参数的调用:

@patch('requests.post')
def send_e2e_kafka_with_env_vars(mock_post, expect, monkeypatch):
    send_posts()
    
    mock_post.assert_any_call(
        url='google.com',
        json={'records': [{'value': message}]}
    )

为什么你之前的代码报错?

你写的args, kwargs = my_first_call[0]是错误的:my_first_call[0]返回的是调用的位置参数元组(而你的POST请求用的全是关键字参数,这个元组是空的),试图把空元组解包成两个变量自然会抛出ValueError: too many values to unpack (expected 2)。正确的做法是直接访问调用对象的kwargs属性,或者用call_args_list获取完整的参数对。

内容的提问来源于stack exchange,提问作者cdm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:22:05