Widget test fails because pump was not called

The following assertion was thrown during a scheduler callback: There are no more frames to dispose.

Quick Answer

In widget tests, you must call tester.pump() or tester.pumpAndSettle() after interactions.

Why This Happens

In Flutter widget tests, the framework does not automatically process frames. After triggering state changes (tap, enter text), you must call pump() to process the next frame or pumpAndSettle() to wait for all animations. Without this, the widget tree is not updated.

The Problem

testWidgets('counter increments', (tester) async {
  await tester.pumpWidget(MyApp());
  await tester.tap(find.byIcon(Icons.add));
  // Missing pump!
  expect(find.text('1'), findsOneWidget); // Fails!
});

The Fix

testWidgets('counter increments', (tester) async {
  await tester.pumpWidget(MyApp());
  await tester.tap(find.byIcon(Icons.add));
  await tester.pump(); // Process the frame
  expect(find.text('1'), findsOneWidget);
});

Step-by-Step Fix

  1. 1

    Identify the error

    Look at test failures where widget state did not update after interactions like tap or entering text.

  2. 2

    Find the cause

    Check if tester.pump() or tester.pumpAndSettle() is called after each interaction that changes widget state.

  3. 3

    Apply the fix

    Add await tester.pump() after taps and state changes, or await tester.pumpAndSettle() for animations.

Bugsly catches this automatically

Bugsly's AI analyzes this error pattern in real-time, explains what went wrong in plain English, and suggests the exact fix — before your users even report it.

Try Bugsly free