From 3ca01351cb3569065a3774cabadfb7d74fca9866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 6 Oct 2026 10:23:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D(=E7=94=BB=E5=B8=83=E9=A1=B6?= =?UTF-8?q?=E6=A0=8F):=20=E6=98=8E=E7=BB=86=E5=BC=B9=E5=B1=82=E4=BC=98?= =?UTF-8?q?=E5=85=88=E5=B1=95=E7=A4=BA=E9=92=B1=E5=8C=85=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - walletDetailsError 改为 mudPointBalanceError || rechargeError,避免充值弹层原始错误串(network down)泄漏到顶栏明细 - 单测补齐 AuthGate 挂载时的那次余额读取,并在 hover 后等待错误文案提交(弹层先渲染 loading 态) - 两个原本失败的用例(ImageCanvasEditorView / createProfileWalletStore)恢复通过 --- .../image-editor/ImageCanvasEditorView.test.tsx | 10 +++++++++- src/components/image-editor/ImageCanvasEditorView.tsx | 4 +++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/components/image-editor/ImageCanvasEditorView.test.tsx b/src/components/image-editor/ImageCanvasEditorView.test.tsx index a29a45263..9638e2504 100644 --- a/src/components/image-editor/ImageCanvasEditorView.test.tsx +++ b/src/components/image-editor/ImageCanvasEditorView.test.tsx @@ -708,6 +708,12 @@ describe('ImageCanvasEditorView', () => { getPlatformProfileRechargeCenterMock.mockRejectedValue( new Error('network down'), ); + // 真实链路里 AuthGate 挂载 usePlatformWalletLifecycle 时会触发首次余额读取;本用例独立渲染 + // ImageCanvasEditorView,需手动补上这一步。否则 store 停在 idle,入口把它当成 loading 而 + // 跳过 hover 触发的明细请求,弹层会永远停在「余额读取中」。 + await act(async () => { + await usePlatformWalletStore.getState().onWalletBalanceMayHaveChanged(); + }); render( { const details = await screen.findByRole('dialog', { name: '会员与泥点账户详情', }); - expect(within(details).getByText('泥点明细读取失败')).toBeTruthy(); + // 详情弹层打开即渲染 loading 态,读取失败的 rejection 在下一个微任务才提交; + // 必须等待错误文案出现,否则同步 getByText 会稳定命中的是「余额读取中」。 + expect(await within(details).findByText('泥点明细读取失败')).toBeTruthy(); expect(within(details).queryByText('充值中心响应缺少泥点余额')).toBeNull(); expect(within(details).queryByText('永久泥点')).toBeNull(); expect(within(details).queryByText('每日免费泥点')).toBeNull(); diff --git a/src/components/image-editor/ImageCanvasEditorView.tsx b/src/components/image-editor/ImageCanvasEditorView.tsx index e417b1dee..ff65cfe2b 100644 --- a/src/components/image-editor/ImageCanvasEditorView.tsx +++ b/src/components/image-editor/ImageCanvasEditorView.tsx @@ -2527,7 +2527,9 @@ export function ImageCanvasEditorView({ walletBreakdown: mudPointBalance, isWalletBalanceLoading, isWalletDetailsLoading: isLoadingRechargeCenter, - walletDetailsError: rechargeError || mudPointBalanceError || null, + // 明细弹层展示的正是钱包 store 的 breakdown;其读取失败文案优先于充值弹层的原始报错, + // 避免把「读详情」的原始错误串(如 network down)泄漏到顶栏明细里。 + walletDetailsError: mudPointBalanceError || rechargeError || null, currentUser: authUi?.user, assetExportStatus, isExportingAssets,