import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:provider/provider.dart'; import 'package:provider/single_child_widget.dart'; /// 공통 위젯 테스트 유틸 /// - MaterialApp/Scaffold 래핑 /// - Provider 래핑 헬퍼 /// - 드롭다운 오버레이 비의존 패턴(onChanged 직접 호출) 헬퍼 class WidgetTestUtils { const WidgetTestUtils._(); /// MaterialApp + Scaffold로 감싸서 펌프 static Future pumpWithScaffold( WidgetTester tester, Widget child, ) async { await tester.pumpWidget( MaterialApp( home: Scaffold(body: child), ), ); // 첫 프레임 렌더링 await tester.pump(); } /// MultiProvider로 감싸서 펌프 static Future pumpWithProviders( WidgetTester tester, { required List providers, required Widget child, }) async { await tester.pumpWidget( MultiProvider( providers: providers, child: MaterialApp(home: Scaffold(body: child)), ), ); await tester.pump(); } /// DropdownButtonFormField의 onChanged를 직접 호출하여 값 변경 /// overlay를 열지 않아도 되어 타임아웃/플레이키를 방지한다. static Future selectDropdownValue( WidgetTester tester, { Key? fieldKey, T? value, Type fieldType = DropdownButtonFormField, }) async { final finder = fieldKey != null ? find.byKey(fieldKey) : find.byType(fieldType); final field = tester.widget>(finder); field.onChanged?.call(value); await tester.pump(); } }