Testing shared_preferences on flutter
You needed to mock getAll
from shared_preferences
(ref: https://pub.dartlang.org/packages/shared_preferences)
Here's the sample code:
import 'package:shared_preferences/shared_preferences.dart';import 'package:flutter/services.dart'; // <-- needed for `MethodChannel`void main() { setUpAll(() { const MethodChannel('plugins.flutter.io/shared_preferences') .setMockMethodCallHandler((MethodCall methodCall) async { if (methodCall.method == 'getAll') { return <String, dynamic>{}; // set initial values here if desired } return null; }); }); testWidgets('Click on login saves the credentials', (WidgetTester tester) async { await tester.pumpWidget(MyApp()); await tester.enterText(find.byKey(Key('phoneInput')), 'test'); await tester.enterText(find.byKey(Key('passwordInput')), 'test'); await tester.tap(find.byIcon(Icons.lock)); SharedPreferences prefs = await SharedPreferences.getInstance(); expect(prefs.getString('phone'), 'test'); expect(prefs.getString('password'), 'test'); });}
Original answer:
testWidgets('Click on login saves the credentials', (WidgetTester tester) async { final AutomatedTestWidgetsFlutterBinding binding = tester.binding; binding.addTime(const Duration(seconds: 10)); // or longer if needed await tester.pumpWidget(MyApp()); await tester.enterText(find.byKey(Key('phoneInput')), 'test'); await tester.enterText(find.byKey(Key('passwordInput')), 'test'); await tester.tap(find.byIcon(Icons.lock)); SharedPreferences prefs = await SharedPreferences.getInstance(); expect(prefs.getString('phone'), 'test'); expect(prefs.getString('password'), 'test'); });
As mentioned at github you can do something like this at the beginning of your test:
tester.addTime(const Duration(seconds: 10));
Here is the link and full example :https://github.com/flutter/flutter/issues/19175
testWidgets('MyWidget', (WidgetTester tester) async { final AutomatedTestWidgetsFlutterBinding binding = tester.binding; binding.addTime(const Duration(seconds: 10)); // or longer if needed await tester.pumpWidget(new MyWidget()); await tester.tap(find.text('Save')); expect(find.text('Success'), findsOneWidget);});
You could use the provided mock setMockInitialValues
testWidgets('Click on login saves the credentials', (WidgetTester tester) async { await tester.pumpWidget(MyApp()); SharedPreferences.setMockInitialValues(<String, dynamic>{ 'flutter.phone': '', 'flutter.password': '', }); await tester.enterText(find.byKey(Key('phoneInput')), 'test'); await tester.enterText(find.byKey(Key('passwordInput')), 'test'); await tester.tap(find.byIcon(Icons.lock)); SharedPreferences prefs = await SharedPreferences.getInstance(); expect(prefs.getString('phone'), 'test'); expect(prefs.getString('password'), 'test'); });