使用execute_curl函数时Bats测试返回97错误的修复需求
解决Mock Curl脚本无法匹配execute_curl函数调用的问题
直接调用curl测试通过,但通过execute_curl函数调用时返回错误码97,核心原因是mock脚本的参数匹配逻辑没有覆盖execute_curl调用curl的实际参数格式。以下是具体修改方案:
问题诊断
execute_curl作为封装函数,通常会给curl添加额外选项(比如Header、请求方法),或者对URL做动态拼接(比如添加查询参数),而原始mock脚本可能只硬匹配固定的URL字符串,导致无法命中匹配逻辑,返回预设的错误码97。
修改后的Mock Curl脚本
版本1:适配带额外选项的curl调用
该版本会自动跳过curl的选项参数(如-H、-X),定位到实际的URL参数,支持精确或模糊匹配:
#!/bin/bash # 遍历参数,提取实际请求的URL target_url="" for arg in "$@"; do # 识别URL:以http/https开头,或非选项参数(不以-开头) if [[ "$arg" =~ ^https?:// || "$arg" != -* ]]; then target_url="$arg" break fi done # 匹配目标URL(可根据需求修改为你的目标地址) if [[ "$target_url" == "https://your-target-domain.com/api" || "$target_url" == "https://your-target-domain.com/api?*" ]]; then # 返回模拟的响应内容 echo '{"code": 200, "msg": "success"}' exit 0 else # 可选:添加调试日志,记录未匹配的参数 echo "Unmatched args: $*" >> /tmp/mock_curl_debug.log exit 97 fi
版本2:支持动态URL的正则匹配
如果execute_curl调用的URL带有动态参数(如时间戳、token),可以用正则匹配URL前缀:
#!/bin/bash # 提取URL参数 target_url="" for arg in "$@"; do if [[ "$arg" =~ ^https?:// ]]; then target_url="$arg" break fi done # 用正则匹配URL前缀,忽略后续动态参数 if [[ "$target_url" =~ ^https://your-target-domain.com/api ]]; then echo '{"code": 200, "msg": "success"}' exit 0 else exit 97 fi
后续操作
- 将mock目录下的
curl脚本替换为上述修改后的版本 - 确保脚本有执行权限:
chmod +x mock/curl - 重新运行bats测试:
bats test.bats
内容的提问来源于stack exchange,提问作者check check
相关产品推荐
相关产品推荐

