抽取共享 ResizeObserver 测试桩
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 4m59s
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled

让项目开发测试复用统一 observer 安装 helper

保留 observer 创建与断开计数断言
This commit is contained in:
2026-09-14 19:24:23 +08:00
parent a0b5a84d61
commit 174b6dd347
2 changed files with 31 additions and 27 deletions
@@ -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({
@@ -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 编辑器返回平移测试',