修 appSurface 生成任务用例的异步排空:等阶段合并、等轮询退出

- 阶段文案与徽标改用 waitFor:本地队列的「排队中。」先于后端记录合并,同步断言在整套连跑时抢跑
- 用例收尾连等两个 poll 周期(2s)并断言账本读计数不再增长,确认这条轮询链在本用例内退出
- 留在线上的轮询醒来会打进下一个用例的 spy(宿主按调用时读 __TAURI__),故排空放在用例内,未动全局 harness
- 未改生产:后台任务跨面板保活保持原样
This commit is contained in:
2026-09-17 19:44:48 +08:00
parent e0f9f811b7
commit 6fcf42e4ac
@@ -11831,8 +11831,15 @@ export function registerProjectAgentStatusTests() {
// 2) 面板关掉之后任务仍在「生成任务」面板里,阶段文案来自后端记录。
const taskPanel = await screen.findByRole('region', { name: '生成任务' });
expect(within(taskPanel).getByText('第一条设计图')).not.toBeNull();
expect(within(taskPanel).getByText('正在生成。')).not.toBeNull();
expect(within(taskPanel).getByText('生成中')).not.toBeNull();
/**
* 阶段文案与徽标要**等**后端记录并进来:刚提交时任务还停在本地队列的「排队中。」,
* 记录合并发生在第一轮账本轮询(间隔 2s)之后。同步断言在这里读到的会是本地阶段,
* 在整套连跑时必然抢跑(隔离单跑时那一拍刚好落在窗口内,所以只在全量里红)。
*/
await waitFor(() => {
expect(within(taskPanel).getByText('正在生成。')).not.toBeNull();
expect(within(taskPanel).getByText('生成中')).not.toBeNull();
});
// 非模态:没有全屏遮罩、没有 aria-modal。
expect(taskPanel.getAttribute('aria-modal')).toBeNull();
expect(document.querySelector('[aria-modal="true"]')).toBeNull();
@@ -11890,6 +11897,28 @@ export function registerProjectAgentStatusTests() {
expect(
calls.filter((call) => call.command === 'get_local_game_manifest').length,
).toBeGreaterThanOrEqual(manifestReadsBefore + 2);
/**
* 5) 等轮询真的退出:两个 mock 任务都已收口 completed,再连等两个 poll 周期
* (间隔 2s),账本读计数不再增长才算这条异步链跑完。
*
* 宿主读账本用的是「调用时」的 `window.__TAURI__`,而 afterEach 会把它删掉、下一个用例
* 再装自己的 mock:留下一条在途/在睡的轮询,下一轮醒来就会打进**下一个用例**的 spy
* (实测就是 `does not open a preview before a local project is initialized` 那条变红,
* 且看到的 projectPath 是本案的)。所以排空必须发生在本用例内部,而不是靠全局 harness 掩盖。
*/
const ledgerReads = () =>
calls.filter(
(call) => call.command === 'list_local_project_asset_generations',
).length;
await act(async () => {
await new Promise((resolve) => setTimeout(resolve, 2_200));
});
const ledgerReadsAfterFirstQuietPeriod = ledgerReads();
await act(async () => {
await new Promise((resolve) => setTimeout(resolve, 2_200));
});
expect(ledgerReads()).toBe(ledgerReadsAfterFirstQuietPeriod);
}, 30_000);
/**