Pytest测试fetch_recent_klines去重逻辑失败:未触发陈旧API返回[]
问题:测试Bybit V5 API K线去重逻辑失败
背景
我正在测试从Bybit V5 API获取1分钟K线数据的fetch_recent_klines()函数,该函数设计为收到重复数据块时终止并返回[],以此检测陈旧API响应。
🔍 去重逻辑
chunk_key = hashlib.md5(str([row[0] for row in chunk]).encode()).hexdigest() if chunk_key in seen_chunks: return []
模拟测试设置
def build_chunk(): return [[str(1717382400000), "", "", "", "", "1"] for _ in range(100)] mock_response = {"result": {"list": build_chunk()}} responses = [mock_response, mock_response, mock_response] def side_effect(*args, **kwargs): if responses: return MagicMock(status_code=200, json=lambda: responses.pop(0)) return MagicMock(status_code=200, json=lambda: {"result": {"list": []}})
测试代码
with patch("scan.requests.get", side_effect=side_effect): result = scan.fetch_recent_klines("BTCUSDT", total=315) assert result == []
问题详情
尽管模拟的数据块完全相同、哈希仅基于时间戳,且真实API环境下代码有效,但函数从未返回[],去重逻辑未触发。不过调试消息显示:[DEBUG] Duplicate chunk detected, breaking early.
已尝试方案
- 调整
total=参数(101、200、315) - 仅对时间戳进行哈希
- 验证行内容完全一致
- 将
json=lambda:替换为直接字典
即便做了这些尝试,测试仍返回完整K线数据,未触发提前终止。请问如何编写测试以验证陈旧数据去重逻辑有效?MagicMock是否会以某种微妙方式干扰哈希或身份比较?
内容的提问来源于stack exchange,提问作者b-Water
相关产品推荐
相关产品推荐

