Skip to content

Instantly share code, notes, and snippets.

@MarcinusX
Created January 3, 2023 14:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MarcinusX/01880e87f9c4d612903df3eb8a2877a8 to your computer and use it in GitHub Desktop.
Save MarcinusX/01880e87f9c4d612903df3eb8a2877a8 to your computer and use it in GitHub Desktop.
This gist is to represent unexpected behaviour when testing FutureProvider in Riverpod 2.1.3
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
void main() {
group('RiverpodFutureProviders', () {
// this fails - async is returned
testWidgets('Future.value works', (tester) async {
await tester.pumpRiverpodFutureProviders(Future.value('hello'));
expect(find.text('hello'), findsOneWidget);
});
// this works
testWidgets('just value works', (tester) async {
await tester.pumpRiverpodFutureProviders('hello');
expect(find.text('hello'), findsOneWidget);
});
//this works
testWidgets('loading works', (tester) async {
await tester.pumpRiverpodFutureProviders(Future.any([]));
expect(find.text('loading'), findsOneWidget);
});
// this fails - async is returned
testWidgets('error works', (tester) async {
await tester.pumpRiverpodFutureProviders(Future.error('foo'));
await tester.pumpAndSettle();
expect(find.text('foo'), findsOneWidget);
});
// this works
testWidgets('delayed error works', (tester) async {
await tester.pumpRiverpodFutureProviders(
Future.delayed(
const Duration(milliseconds: 100),
() => throw 'foo',
),
);
await tester.pumpAndSettle();
expect(find.text('foo'), findsOneWidget);
});
});
}
final asyncDataProvider = FutureProvider((ref) => 'data');
extension on WidgetTester {
Future<void> pumpRiverpodFutureProviders(FutureOr<String> future) =>
pumpWidget(
ProviderScope(
overrides: [
asyncDataProvider.overrideWith((ref) => future),
],
child: MaterialApp(
home: Scaffold(
body: Consumer(
builder: (context, ref, child) {
final snapshot = ref.watch(asyncDataProvider);
print(snapshot);
return snapshot.map(
data: (data) => Text(data.value),
error: (error) => Text(error.error.toString()),
loading: (loading) => const Text('loading'),
);
},
),
),
),
),
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment