修 appSurface 生成任务用例的异步排空:等阶段合并、等轮询退出
- 阶段文案与徽标改用 waitFor:本地队列的「排队中。」先于后端记录合并,同步断言在整套连跑时抢跑 - 用例收尾连等两个 poll 周期(2s)并断言账本读计数不再增长,确认这条轮询链在本用例内退出 - 留在线上的轮询醒来会打进下一个用例的 spy(宿主按调用时读 __TAURI__),故排空放在用例内,未动全局 harness - 未改生产:后台任务跨面板保活保持原样
This commit is contained in:
@@ -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);
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user