/** * 用例弹性钩子:上个用例「异常失败」后,下个用例执行前重启 App 复位, * 避免一个用例把 App 留在脏状态(卡子页/残留弹框/中断流程)而级联拖垮同文件后续所有用例。 * * 用法(在 describe 内、beforeAll 之后调用;driver 在 beforeAll 里创建,故用 getter 延迟取): * describe('...', () => { * let driver; * beforeAll(async () => { driver = createDriver(); await driver.createSession(); }); * setupResilientHooks(() => driver); * it(...); * }); */ import { beforeEach, afterEach } from 'vitest'; import { DeviceDriver } from '../../drivers/types'; export function setupResilientHooks(getDriver: () => DeviceDriver | undefined): void { let lastFailed = false; beforeEach(async () => { const driver = getDriver(); if (!driver || !lastFailed) return; lastFailed = false; console.log('上个用例失败 → 重启 App 复位,避免级联失败'); try { if (typeof driver.restartApp === 'function') await driver.restartApp(); await driver.goBackToHomepage(); await driver.dismissPopupIfPresent(); } catch (e: any) { console.log(`复位失败(不阻断后续): ${e?.message || e}`); } }); afterEach((ctx: any) => { // vitest 任务结果:失败则标记,下个用例前复位 if (ctx?.task?.result?.state === 'fail') lastFailed = true; }); }