| name | setup-test |
| description | Set up proper test configuration for Cubits using bloc_superpowers with Superpowers.clear() and Completers |
Set Up Tests for bloc_superpowers
This skill sets up proper test configuration for Cubits using bloc_superpowers.
What This Skill Does
Configures tests to:
- Reset Superpowers state between tests
- Properly test loading and error states
- Use Completers for async test control
Instructions
Step 1: Add setUp with Superpowers.clear()
Always call Superpowers.clear() in setUp to reset state between tests:
import 'package:bloc_superpowers/bloc_superpowers.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
setUp(() {
Superpowers.clear(); // IMPORTANT: Reset state between tests
});
// ... tests
}
Step 2: Test Structure
import 'package:bloc_superpowers/bloc_superpowers.dart';
import 'package:bloc_test/bloc_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
class MockApi extends Mock implements Api {}
void main() {
late UserCubit cubit;
late MockApi mockApi;
setUp(() {
Superpowers.clear(); // Reset Superpowers state
mockApi = MockApi();
cubit = UserCubit(api: mockApi);
});
tearDown(() {
cubit.close();
});
group('UserCubit', () {
test('initial state is correct', () {
expect(cubit.state, const UserState());
});
// ... more tests
});
}
Step 3: Test with Completers for Async Control
Use Completer to control when async operations complete:
test('loadUser sets loading state while fetching', () async {
final completer = Completer<User>();
// Mock returns a future that we control
when(() => mockApi.getUser()).thenAnswer((_) => completer.future);
// Start the operation
cubit.loadUser();
// Wait for next event loop
await Future.delayed(Duration.zero);
// Check loading state
expect(Superpowers.isWaiting(UserCubit), isTrue);
// Complete the operation
completer.complete(User(name: 'John'));
// Wait for completion
await Future.delayed(Duration.zero);
// Check final state
expect(Superpowers.isWaiting(UserCubit), isFalse);
expect(cubit.state.user?.name, 'John');
});