Files

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();
}
}