Created
January 3, 2023 14:17
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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