From 174b6dd3474fe0470e9818b7cd0387d1d6c18d3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Mon, 14 Sep 2026 19:24:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=BD=E5=8F=96=E5=85=B1=E4=BA=AB=20ResizeOb?= =?UTF-8?q?server=20=E6=B5=8B=E8=AF=95=E6=A1=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 让项目开发测试复用统一 observer 安装 helper 保留 observer 创建与断开计数断言 --- .../tests/appSurface/harness.ts | 26 +++++++++++++++ .../appSurface/project-development.suite.ts | 32 +++---------------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/apps/ai-game-creator-shell/tests/appSurface/harness.ts b/apps/ai-game-creator-shell/tests/appSurface/harness.ts index 3c6da89f6..71af32e10 100644 --- a/apps/ai-game-creator-shell/tests/appSurface/harness.ts +++ b/apps/ai-game-creator-shell/tests/appSurface/harness.ts @@ -1227,6 +1227,32 @@ async function openMainProject(projectPath: string) { ).not.toBeNull(); } +export function installResizeObserverStub() { + let observerCount = 0; + let observerDisconnected = false; + class TestResizeObserver { + constructor(readonly callback: ResizeObserverCallback) { + observerCount += 1; + } + + observe() {} + + unobserve() {} + + disconnect() { + observerDisconnected = true; + } + } + Object.defineProperty(window, 'ResizeObserver', { + configurable: true, + value: TestResizeObserver, + }); + return { + observerCount: () => observerCount, + observerDisconnected: () => observerDisconnected, + }; +} + beforeEach(() => { resetLlmModelCatalogCacheForTest(); vi.spyOn(clientApi, 'loadClientLlmModels').mockResolvedValue({ diff --git a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts index 961de55cd..c5288b270 100644 --- a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts +++ b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts @@ -34,6 +34,7 @@ import { GAME_CREATION_AGENT_RUN_SCHEMA_VERSION, type GameCreationAgentRunTrace, getResourceSelectButton, + installResizeObserverStub, it, mockRoleAgentReply, openResourceFilterPanel, @@ -4708,25 +4709,7 @@ export function registerProjectWorkbenchFoundationTests() { manuallyPlaced: false, }, ]; - let observerCount = 0; - let observerDisconnected = false; - class TestResizeObserver { - constructor(readonly callback: ResizeObserverCallback) { - observerCount += 1; - } - - observe() {} - - unobserve() {} - - disconnect() { - observerDisconnected = true; - } - } - Object.defineProperty(window, 'ResizeObserver', { - configurable: true, - value: TestResizeObserver, - }); + const resizeObserver = installResizeObserverStub(); const animationFrame = vi.spyOn(window, 'requestAnimationFrame'); const originalGetBoundingClientRect = HTMLElement.prototype.getBoundingClientRect; @@ -4818,7 +4801,7 @@ export function registerProjectWorkbenchFoundationTests() { /^url\(#.+-asset-reference-arrow\)$/u, ); }); - expect(observerCount).toBe(1); + expect(resizeObserver.observerCount()).toBe(1); expect( overlay .querySelector('[data-testid="resource-dependency-overlay-scene"]') @@ -4865,7 +4848,7 @@ export function registerProjectWorkbenchFoundationTests() { ), ); rendered.unmount(); - expect(observerDisconnected).toBe(true); + expect(resizeObserver.observerDisconnected()).toBe(true); expect(removeViewportListener).toHaveBeenCalledWith( 'scroll', expect.any(Function), @@ -5917,12 +5900,7 @@ export function registerProjectWorkbenchFoundationTests() { }); it('restores resource canvas panning after returning from the UI editor', async () => { - class TestResizeObserver { - constructor(_callback: ResizeObserverCallback) {} - observe() {} - disconnect() {} - } - vi.stubGlobal('ResizeObserver', TestResizeObserver); + installResizeObserverStub(); const manifest = createGameCreationAppManifest( 'workbench-ui-editor-return-pan', 'UI 编辑器返回平移测试',