绕过 Supabase Auth 实现 Playwright E2E 测试免登录
· 阅读需 4 分钟
在为客户构建 AI Agent SaaS 平台时遇到此问题,记录根因与解法。
TL;DR
E2E 测试不应该依赖真实的 OAuth 登录流程。通过在 useAuth hook 中检测 localStorage 的测试标记,直接注入 mock 认证状态,跳过 Supabase 初始化。同时将 Zustand store 的 loading 默认值改为 false,避免 AuthGuard 卡在无限 spinner。
问题现象
使用 Playwright 测试 React SPA 时,页面被 AuthGuard 组件保护,需要 Supabase 认证才能访问。测试启动后,页面一直显示 loading spinner,无法进入业务流程。
// AuthGuard 组件 - 测试时卡在这里
export function AuthGuard({ children }: AuthGuardProps) {
const { isAuthenticated, loading } = useAuth()
if (loading) {
return <Spinner /> // 永远显示 spinner
}
if (!isAuthenticated) {
return <Navigate to="/login" />
}
return <>{children}</>
}
测试代码尝试模拟登录,但 Supabase Auth SDK 内部状态无法通过简单的 API mock 控制。