Saltearse al contenido

Pruebas

Bloc fue diseñado para ser extremadamente fácil de probar. En esta sección, repasaremos cómo hacer pruebas unitarias a un bloc.

Para simplificar, escribamos pruebas para el CounterBloc que creamos en Conceptos Básicos.

Para recapitular, la implementación de CounterBloc se ve así:

counter_bloc.dart
sealed class CounterEvent {}
final class CounterIncrementPressed extends CounterEvent {}
final class CounterDecrementPressed extends CounterEvent {}
class CounterBloc extends Bloc<CounterEvent, int> {
CounterBloc() : super(0) {
on<CounterIncrementPressed>((event, emit) => emit(state + 1));
on<CounterDecrementPressed>((event, emit) => emit(state - 1));
}
}

Configuración

Antes de comenzar a escribir nuestras pruebas, vamos a necesitar agregar un marco de pruebas a nuestras dependencias.

Necesitamos agregar test y bloc_test a nuestro proyecto.

Ventana de terminal
dart pub add dev:test dev:bloc_test

Pruebas

Comencemos creando el archivo para nuestras pruebas de CounterBloc, counter_bloc_test.dart e importando el paquete de pruebas.

counter_bloc_test.dart
import 'package:test/test.dart';
import 'package:bloc_test/bloc_test.dart';

A continuación, necesitamos crear nuestro main así como nuestro grupo de pruebas.

counter_bloc_test.dart
void main() {
group(CounterBloc, () {
});
}

Comencemos creando una instancia de nuestro CounterBloc que se utilizará en todas nuestras pruebas.

counter_bloc_test.dart
group(CounterBloc, () {
late CounterBloc counterBloc;
setUp(() {
counterBloc = CounterBloc();
});
});

Ahora podemos comenzar a escribir nuestras pruebas individuales.

counter_bloc_test.dart
group(CounterBloc, () {
late CounterBloc counterBloc;
setUp(() {
counterBloc = CounterBloc();
});
test('initial state is 0', () {
expect(counterBloc.state, equals(0));
});
});

¡En este punto deberíamos tener nuestra primera prueba aprobada! Ahora escribamos una prueba más compleja usando el paquete bloc_test.

counter_bloc_test.dart
blocTest(
'emits [1] when CounterIncrementPressed is added',
build: () => counterBloc,
act: (bloc) => bloc.add(CounterIncrementPressed()),
expect: () => [1],
);
blocTest(
'emits [-1] when CounterDecrementPressed is added',
build: () => counterBloc,
act: (bloc) => bloc.add(CounterDecrementPressed()),
expect: () => [-1],
);

Deberíamos poder ejecutar las pruebas y ver que todas están aprobadas.

Eso es todo, las pruebas deberían ser fáciles y deberíamos sentirnos seguros al hacer cambios y refactorizar nuestro código.

Puedes consultar la Aplicación del Clima para un ejemplo de una aplicación completamente probada.