From 5e5a6cf84a106170aa9c6d807d32c45a52f2b645 Mon Sep 17 00:00:00 2001 From: claude_dev Date: Sat, 11 Jul 2026 14:17:01 +0800 Subject: [PATCH] =?UTF-8?q?test(backtest):=20sys.modules=20mock=20?= =?UTF-8?q?=E6=94=B9=E6=9D=A1=E4=BB=B6=E5=BC=8F(find=5Fspec)=E2=80=94?= =?UTF-8?q?=E5=AE=B9=E5=99=A8=E9=87=8C=E7=9C=9F=E6=A8=A1=E5=9D=97=E5=8F=AF?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=88=99=E4=B8=8Dmock,=E6=A0=B9=E9=99=A4coll?= =?UTF-8?q?ection=E6=9C=9F=E6=B1=A1=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/backtest/test_cta_engine.py | 36 +++++++++++++++++-------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/tests/backtest/test_cta_engine.py b/tests/backtest/test_cta_engine.py index 7ca012c..555be72 100644 --- a/tests/backtest/test_cta_engine.py +++ b/tests/backtest/test_cta_engine.py @@ -1,26 +1,30 @@ """Tests for sanguo_backtest.cta_engine module.""" # Mock vnpy and tzlocal modules before importing anything that depends on them import sys +import importlib.util from unittest.mock import MagicMock -# Mock vnpy/tzlocal/empyrical BEFORE importing cta_engine (which imports them at top). -# Save originals so we can RESTORE after this module — otherwise the global sys.modules -# pollution breaks every later test that imports real vnpy/empyrical (datareader/spike/factor/metrics). -_MOCKED_KEYS = ( - "tzlocal", "vnpy.trader.setting", "vnpy.trader.constant", "vnpy.trader.object", - "vnpy.trader.database", "vnpy_ctastrategy.backtesting", "empyrical", -) -_SAVED_MODULES = {k: sys.modules.get(k) for k in _MOCKED_KEYS} - +# Only mock these when the real module is NOT importable (e.g. local env missing empyrical). +# In the container (authoritative test env) everything imports fine, so NO mock is installed +# → zero sys.modules pollution leaking into other test modules at collection time. +# (Previous unconditional sys.modules[...]=MagicMock() here broke datareader/spike/factor/metrics +# tests because it ran at collection time and never restored.) mock_tzlocal = MagicMock() mock_tzlocal.get_localzone_name = MagicMock(return_value="UTC") -sys.modules["tzlocal"] = mock_tzlocal -sys.modules["vnpy.trader.setting"] = MagicMock() -sys.modules["vnpy.trader.constant"] = MagicMock() -sys.modules["vnpy.trader.object"] = MagicMock() -sys.modules["vnpy.trader.database"] = MagicMock() -sys.modules["vnpy_ctastrategy.backtesting"] = MagicMock() -sys.modules["empyrical"] = MagicMock() +_MOCK_FACTORIES = { + "tzlocal": lambda: mock_tzlocal, + "vnpy.trader.setting": MagicMock, + "vnpy.trader.constant": MagicMock, + "vnpy.trader.object": MagicMock, + "vnpy.trader.database": MagicMock, + "vnpy_ctastrategy.backtesting": MagicMock, + "empyrical": MagicMock, +} +_SAVED_MODULES = {} +for _name, _factory in _MOCK_FACTORIES.items(): + if importlib.util.find_spec(_name) is None: + _SAVED_MODULES[_name] = sys.modules.get(_name) + sys.modules[_name] = _factory() import pytest import json