From 79b153e3fa60a0b77ea9f12a50f43e67beb4fc9d Mon Sep 17 00:00:00 2001 From: Linghong Date: Wed, 16 Sep 2026 13:24:14 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DDirect=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=E5=9B=9E=E5=90=88=E9=87=8D=E8=AF=95=E7=B1=BB=E5=9E=8B=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重试等待 Promise 显式声明为 void,修复 shell typecheck 与原生构建失败。 补充卸载后取消读取重试的回归测试。 --- .../agent-runtime/directActiveTurns.ts | 2 +- .../tests/directActiveTurns.test.tsx | 39 ++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/apps/ai-game-creator-shell/src/features/agent-runtime/directActiveTurns.ts b/apps/ai-game-creator-shell/src/features/agent-runtime/directActiveTurns.ts index 58401f52a..f859284e1 100644 --- a/apps/ai-game-creator-shell/src/features/agent-runtime/directActiveTurns.ts +++ b/apps/ai-game-creator-shell/src/features/agent-runtime/directActiveTurns.ts @@ -78,7 +78,7 @@ export function useDirectActiveTurns({ return; } catch { if (attempt < DIRECT_ACTIVE_TURNS_READ_ATTEMPTS) { - await new Promise((resolve) => { + await new Promise((resolve) => { retryTimerRef.current = window.setTimeout(() => { retryTimerRef.current = null; resolve(); diff --git a/apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx b/apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx index 5a000bf39..71fc665ef 100644 --- a/apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx +++ b/apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx @@ -1,12 +1,49 @@ // @vitest-environment jsdom -import { cleanup, fireEvent, render, screen } from '@testing-library/react'; +import { + act, + cleanup, + fireEvent, + render, + renderHook, + screen, +} from '@testing-library/react'; import { afterEach, expect, it, vi } from 'vitest'; +import { useDirectActiveTurns } from '../src/features/agent-runtime/directActiveTurns'; import { ActiveProjectRunsPanel } from '../src/features/app-shell/ActiveProjectRunsPanel'; afterEach(() => cleanup()); +it('读取失败后的重试定时器会在卸载后清理', async () => { + vi.useFakeTimers(); + const invoke = vi.fn(async () => { + throw new Error('temporarily unavailable'); + }); + const clearTimeoutSpy = vi.spyOn(window, 'clearTimeout'); + + try { + const { unmount } = renderHook(() => + useDirectActiveTurns({ invoke, enabled: true }), + ); + await act(async () => { + await vi.advanceTimersByTimeAsync(0); + }); + expect(invoke).toHaveBeenCalledTimes(1); + + unmount(); + expect(clearTimeoutSpy).toHaveBeenCalled(); + + await act(async () => { + await vi.advanceTimersByTimeAsync(1_000); + }); + expect(invoke).toHaveBeenCalledTimes(1); + } finally { + vi.useRealTimers(); + clearTimeoutSpy.mockRestore(); + } +}); + it('按开始时间展示正在运行的项目并支持进入项目', () => { const onOpenProject = vi.fn(); render(