Python3环境下使用pytest对wait_until逻辑进行mock测试
结论
完全可以通过mock单元测试实现你的验证目标,全程不需要真实可用的api_key,也不会触发真实接口请求。
核心实现逻辑
- 替换所有外部依赖为mock对象,彻底隔离真实接口逻辑:
- mock底层
api函数,直接返回构造好的假response对象,提前写入固定的伪造id值,不需要真实api_key就能走通后续流程。 - mock
get_api函数,内置参数校验规则:如果调用时缺失必填参数、或者传入的id和伪造的response.id不匹配,直接抛出异常让测试失败;参数校验通过则返回模拟的查询对象即可。 - mock
wait_until函数,跳过真实的轮询等待逻辑,只校验传入的state参数是否为Success,避免测试无意义耗时。
- mock底层
- 测试执行时传入任意字符串作为假api_key即可,因为真实的api请求逻辑已经被完全拦截。
参考测试示例(基于pytest+unittest.mock)
from unittest.mock import Mock, patch # 导入存放call_api逻辑的业务模块 import business_module def test_call_api_with_wait_flag(): # 构造固定id的伪造响应对象 fake_resp = Mock() fake_resp.id = "mock_response_id_001" with patch("business_module.api", return_value=fake_resp) as mock_api_call, \ patch("business_module.get_api") as mock_get_api, \ patch("business_module.wait_until") as mock_wait_util: # 给get_api添加参数校验逻辑 def get_api_param_check(*args, **kwargs): # 校验第一个位置参数必须是伪造的response.id if not args or args[0] != fake_resp.id: raise AssertionError("get_api未传入正确的response.id") # 按需补充get_api的其他必填参数校验,比如必填参数biz_type的校验: # if "biz_type" not in kwargs: # raise AssertionError("get_api缺失必填参数biz_type") return Mock() mock_get_api.side_effect = get_api_param_check # 传入无效的假api_key执行测试 business_module.call_api(api_key="invalid_fake_key", wait=True) # 额外断言调用链路符合预期 mock_api_call.assert_called_once_with("invalid_fake_key") mock_get_api.assert_called_once() assert mock_wait_util.call_args.kwargs.get("state") == "Success"
你只需要在
get_api_param_check方法里补全get_api所有必填参数的校验规则即可,只要实际调用时存在参数缺失、参数值错误的情况,测试就会直接抛出断言错误标记为失败,完全匹配你的验证需求。
内容的提问来源于stack exchange,提问作者still_learning
相关产品推荐
相关产品推荐

