单元测试中如何断言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
相关产品推荐
相关产品推荐

