import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:lanebow/widgets/owner_dropdown.dart'; import 'package:lanebow/models/member_model.dart'; void main() { group('OwnerDropdown', () { testWidgets('빌드 시 onItemsBuilt로 항목 수를 보고하고, onChanged로 값이 변경된다', (tester) async { // Arrange: 샘플 멤버 2명 final members = [ Member( id: 'm1', userId: 'u1', clubId: 'c1', name: '아무개 A', email: 'a@example.com', gender: 'male', isActive: true, memberType: 'regular', status: 'active', ), Member( id: 'm2', userId: 'u2', clubId: 'c1', name: '아무개 B', email: 'b@example.com', gender: 'female', isActive: true, memberType: 'associate', status: 'active', ), ]; String? selected = members.first.userId; int? builtCount; await tester.pumpWidget( MaterialApp( home: Scaffold( body: Padding( padding: const EdgeInsets.all(8.0), child: OwnerDropdown( members: members, value: selected, onChanged: (v) { selected = v; }, onItemsBuilt: (count) => builtCount = count, ), ), ), ), ); // onItemsBuilt는 microtask로 호출되므로 한 번 더 펌프 await tester.pump(); // Assert: 항목 수 콜백이 2로 보고됨 expect(builtCount, 2); // Act: 오버레이를 열지 않고 DropdownButtonFormField의 onChanged를 직접 호출 final field = tester.widget>( find.byType(DropdownButtonFormField), ); field.onChanged?.call(members[1].userId); // 한 프레임 펌프하여 상태 반영 await tester.pump(); // Assert: 선택 값이 두 번째 사용자로 변경됨 expect(selected, members[1].userId); }); }); }