36 lines
1.4 KiB
TypeScript
36 lines
1.4 KiB
TypeScript
/**
|
|
* 用例弹性钩子:上个用例「异常失败」后,下个用例执行前重启 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;
|
|
});
|
|
}
|