58 lines
1.6 KiB
Dart
58 lines
1.6 KiB
Dart
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<void> pumpWithScaffold(
|
|
WidgetTester tester,
|
|
Widget child,
|
|
) async {
|
|
await tester.pumpWidget(
|
|
MaterialApp(
|
|
home: Scaffold(body: child),
|
|
),
|
|
);
|
|
// 첫 프레임 렌더링
|
|
await tester.pump();
|
|
}
|
|
|
|
/// MultiProvider로 감싸서 펌프
|
|
static Future<void> pumpWithProviders(
|
|
WidgetTester tester, {
|
|
required List<SingleChildWidget> 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<void> selectDropdownValue<T>(
|
|
WidgetTester tester, {
|
|
Key? fieldKey,
|
|
T? value,
|
|
Type fieldType = DropdownButtonFormField,
|
|
}) async {
|
|
final finder = fieldKey != null
|
|
? find.byKey(fieldKey)
|
|
: find.byType(fieldType);
|
|
final field = tester.widget<DropdownButtonFormField<T>>(finder);
|
|
field.onChanged?.call(value);
|
|
await tester.pump();
|
|
}
|
|
}
|