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 @@