スキル一覧に戻る
AVRA-CADAVRA

widget-test-patterns

by AVRA-CADAVRA

0🍴 0📅 2026年1月24日
GitHubで見るManusで実行

SKILL.md


name: widget-test-patterns description: Guides widget test patterns: BLoC testing, user interactions, state changes, material app setup. Use when writing widget tests, testing UI components, or validating widget behavior.

Widget Test Patterns

Core Pattern

Widget tests verify UI behavior: user interactions, state changes, and visual display.

Basic Widget Test Setup

testWidgets('widget displays correctly', (WidgetTester tester) async {
  // Arrange: Create widget
  await tester.pumpWidget(
    MaterialApp(
      home: MyWidget(),
    ),
  );
  
  // Assert: Verify UI elements
  expect(find.text('Hello'), findsOneWidget);
  expect(find.byType(Button), findsOneWidget);
});

BLoC Integration Testing

testWidgets('widget reacts to BLoC state changes', (tester) async {
  // Arrange: Create BLoC
  final bloc = MyBloc(useCase: mockUseCase);
  
  // Create widget with BLoC
  await tester.pumpWidget(
    MaterialApp(
      home: BlocProvider(
        create: (_) => bloc,
        child: MyWidget(),
      ),
    ),
  );
  
  // Act: Emit state change
  bloc.add(LoadData());
  await tester.pumpAndSettle();
  
  // Assert: Verify UI updated
  expect(find.text('Data loaded'), findsOneWidget);
});

User Interaction Testing

testWidgets('widget handles user interactions', (tester) async {
  await tester.pumpWidget(
    MaterialApp(
      home: MyWidget(),
    ),
  );
  
  // Act: Tap button
  await tester.tap(find.byKey(Key('submit_button')));
  await tester.pump();
  
  // Assert: Verify interaction result
  expect(find.text('Submitted'), findsOneWidget);
});

Form Testing

testWidgets('form validates and submits correctly', (tester) async {
  await tester.pumpWidget(
    MaterialApp(
      home: MyForm(),
    ),
  );
  
  // Act: Enter text
  await tester.enterText(find.byKey(Key('email_field')), 'test@example.com');
  await tester.enterText(find.byKey(Key('password_field')), 'password123');
  
  // Tap submit
  await tester.tap(find.byKey(Key('submit_button')));
  await tester.pumpAndSettle();
  
  // Assert: Verify submission
  expect(find.text('Success'), findsOneWidget);
});

State Change Testing

testWidgets('widget updates on state change', (tester) async {
  final bloc = MyBloc();
  
  await tester.pumpWidget(
    MaterialApp(
      home: BlocProvider(
        create: (_) => bloc,
        child: MyWidget(),
      ),
    ),
  );
  
  // Initial state
  expect(find.text('Loading'), findsOneWidget);
  
  // Change state
  bloc.add(DataLoadedEvent(data: 'Test Data'));
  await tester.pumpAndSettle();
  
  // Updated state
  expect(find.text('Test Data'), findsOneWidget);
  expect(find.text('Loading'), findsNothing);
});

Error State Testing

testWidgets('widget displays error state correctly', (tester) async {
  final bloc = MyBloc();
  
  await tester.pumpWidget(
    MaterialApp(
      home: BlocProvider(
        create: (_) => bloc,
        child: MyWidget(),
      ),
    ),
  );
  
  // Emit error state
  bloc.add(ErrorEvent(message: 'Error message'));
  await tester.pumpAndSettle();
  
  // Assert: Error displayed
  expect(find.text('Error message'), findsOneWidget);
  expect(find.byIcon(Icons.error), findsOneWidget);
});

Reference

  • test/widget/pages/auth/login_page_test.dart - Widget test example
  • test/helpers/widget_test_helpers.dart - Test helpers

スコア

総合スコア

60/100

リポジトリの品質指標に基づく評価

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

+10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

レビュー

💬

レビュー機能は近日公開予定です