import { mockLogoutSuccess } from '../../support/mock/handlers/user'; import LoginPage from '../../support/pageObjects/LoginPage'; import MainPage from '../../support/pageObjects/MainPage'; import ExitModalPage from '../../support/pageObjects/ExitModalPage'; describe('User Logout', () => { const loginPage = new LoginPage(); const mainPage = new MainPage(); const exitModalPage = new ExitModalPage(); beforeEach(() => { // 使用封装的登录并初始化命令 cy.loginAndInitialize(); }); it('should successfully logout and return to login page', () => { mockLogoutSuccess(); // 使用 Page Object 点击退出按钮 mainPage.clickExitButton(); // 验证 modal 可见 exitModalPage.shouldBeVisible(); // 点击"注销用户"按钮 exitModalPage.clickLogout(); // 应该显示成功消息 cy.contains('已退出登录').should('be.visible'); // 应该返回登录页面 loginPage.getUsernameInput().should('be.visible'); loginPage.getPasswordInput().should('be.visible'); }); it('should clear user state after logout', () => { mockLogoutSuccess(); // 使用 Page Object 执行登出 mainPage.clickExitButton(); exitModalPage.shouldBeVisible(); exitModalPage.clickLogout(); // 验证 Redux store 中用户信息已清除 cy.window().its('store').invoke('getState') .its('userInfo') .should('deep.equal', { token: '', expire: 0, uid: 0, name: '', avatar: '' }); }); it('should close exit modal when clicking cancel', () => { // 使用 Page Object 打开退出 modal mainPage.clickExitButton(); exitModalPage.shouldBeVisible(); // 点击取消按钮 exitModalPage.clickCancel(); // modal 应该关闭 exitModalPage.shouldNotBeVisible(); }); it('should not call backend logout API (placeholder)', () => { // 由于后端 API 尚未实现,此测试验证不会调用实际的后端接口 // 当前是纯前端状态清除 // 使用 Page Object 执行登出 mainPage.clickExitButton(); exitModalPage.shouldBeVisible(); exitModalPage.clickLogout(); // 验证成功消息 cy.contains('已退出登录').should('be.visible'); // 验证返回登录页 loginPage.getUsernameInput().should('be.visible'); }); });