bloomBUILD•SHIP•BLOOM
.md
High Confidence Testing

Testing & DevTools

Because Bloom signals and controllers are pure Dart classes without Flutter UI dependencies, unit tests execute synchronously in milliseconds.

Controller Unit Testing

Test controllers with standard Dart flutter_test:

test/features/counter_controller_test.dart
dart
// test/features/counter_controller_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:quickstart_app/features/counter/counter_controller.dart';

void main() {
  test('CounterController increments count signal', () {
    final controller = CounterController();
    expect(controller.count.value, equals(0));

    controller.increment();
    expect(controller.count.value, equals(1));
  });
}

Widget Testing with BloomScope

Supply mock services into isolated test containers with BloomScope:

test/routes/counter_test.dart
dart
// test/routes/counter_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:bloom_framework/bloom.dart';
import 'package:quickstart_app/routes/counter.dart';
import 'package:quickstart_app/features/counter/counter_controller.dart';

void main() {
  testWidgets('CounterRoute displays incremented value on tap', (tester) async {
    // Setup isolated test container
    final container = BloomContainer();
    final controller = CounterController();
    container.provideInstance<CounterController>(controller);

    await tester.pumpWidget(
      BloomScope(
        container: container,
        child: const MaterialApp(home: CounterRoute()),
      ),
    );

    expect(find.text('0'), findsOneWidget);

    await tester.tap(find.byIcon(Icons.add));
    await tester.pump(); // Fast synchronous rebuild

    expect(find.text('1'), findsOneWidget);
  });
}