From 4e8aa15b71a23cc0e984eb26b30e155d3dbcfb4e Mon Sep 17 00:00:00 2001 From: cat-shark <1716967236@qq.com> Date: Wed, 5 Aug 2026 21:45:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=80=80=E5=87=BA=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E8=A1=A5=E9=98=B2=E6=8A=96=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/components/MyHead.spec.ts | 21 +++++++++++++++++++++ src/components/MyHead.vue | 19 +++++++++++++------ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/__tests__/components/MyHead.spec.ts b/src/__tests__/components/MyHead.spec.ts index addd933..50d6649 100644 --- a/src/__tests__/components/MyHead.spec.ts +++ b/src/__tests__/components/MyHead.spec.ts @@ -69,4 +69,25 @@ describe('MyHead.vue', () => { expect(ElMessage.success).toHaveBeenCalledWith('已退出登录') expect(router.currentRoute.value.path).toBe('/login') }) + + it('prevents repeated logout while request is pending', async () => { + let resolveLogout!: (value: any) => void + vi.mocked(logout).mockImplementation( + () => new Promise((resolve) => { resolveLogout = resolve }), + ) + localStorage.setItem('isLoggedIn', 'true') + const wrapper = await mountAt('/study') + + const first = wrapper.vm.handleLogout() + const second = wrapper.vm.handleLogout() + await Promise.resolve() + + expect(logout).toHaveBeenCalledTimes(1) + expect(wrapper.vm.loggingOut).toBe(true) + + resolveLogout({ code: 200 }) + await Promise.all([first, second]) + + expect(wrapper.vm.loggingOut).toBe(false) + }) }) diff --git a/src/components/MyHead.vue b/src/components/MyHead.vue index 2fc9d88..c6e2802 100644 --- a/src/components/MyHead.vue +++ b/src/components/MyHead.vue @@ -20,6 +20,7 @@ type="success" plain class="logout-btn" + :loading="loggingOut" @click="handleLogout" > 退出登录 @@ -28,7 +29,7 @@