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

Python3环境下使用pytest对wait_until逻辑进行mock测试

结论

完全可以通过mock单元测试实现你的验证目标,全程不需要真实可用的api_key,也不会触发真实接口请求。

核心实现逻辑
  • 替换所有外部依赖为mock对象,彻底隔离真实接口逻辑:
    • mock底层api函数,直接返回构造好的假response对象,提前写入固定的伪造id值,不需要真实api_key就能走通后续流程。
    • mockget_api函数,内置参数校验规则:如果调用时缺失必填参数、或者传入的id和伪造的response.id不匹配,直接抛出异常让测试失败;参数校验通过则返回模拟的查询对象即可。
    • mockwait_until函数,跳过真实的轮询等待逻辑,只校验传入的state参数是否为Success,避免测试无意义耗时。
  • 测试执行时传入任意字符串作为假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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:24:39