diff --git a/pytests/config_test/test_file_watcher.py b/pytests/config_test/test_file_watcher.py index c2fdd9b2..a6b86477 100644 --- a/pytests/config_test/test_file_watcher.py +++ b/pytests/config_test/test_file_watcher.py @@ -107,13 +107,23 @@ async def test_unsubscribe_stops_dispatch(tmp_path: Path): assert calls == 0 +async def _wait_for(predicate, timeout: float = 5.0, interval: float = 0.05): + """轮询等待 predicate() 为真,避免依赖固定 sleep 导致跨平台不稳定。""" + deadline = asyncio.get_event_loop().time() + timeout + while asyncio.get_event_loop().time() < deadline: + if predicate(): + return + await asyncio.sleep(interval) + raise TimeoutError(f"等待超时({timeout}s)") + + @pytest.mark.asyncio async def test_add_callback_while_watcher_running(tmp_path: Path): dirs = (tmp_path / "a_dir").resolve() dirs.mkdir(exist_ok=True) file = (dirs / "a.toml").resolve() file.touch() - watcher = FileWatcher(paths=[dirs]) + watcher = FileWatcher(paths=[dirs], debounce_ms=200) calls = 0 @@ -124,15 +134,15 @@ async def test_add_callback_while_watcher_running(tmp_path: Path): uuid = watcher.subscribe(callback, paths=[file]) await watcher.start() - with file.open("w") as f: - f.write("change") - await asyncio.sleep(0.5) - with file.open("r") as f: - content = f.read() - print(content) - assert calls == 1 - watcher.unsubscribe(uuid) - with file.open("w") as f: - f.write("change2") - await asyncio.sleep(0.5) - assert calls == 1 \ No newline at end of file + try: + with file.open("w") as f: + f.write("change") + await _wait_for(lambda: calls >= 1) + assert calls == 1 + watcher.unsubscribe(uuid) + with file.open("w") as f: + f.write("change2") + await asyncio.sleep(1.0) + assert calls == 1 + finally: + await watcher.stop() \ No newline at end of file