Skip to content

Instantly share code, notes, and snippets.

@felipecastrosales
Created December 25, 2022 14:08
Show Gist options
  • Save felipecastrosales/c1aa0c23f75f778009d5ffdbe9651404 to your computer and use it in GitHub Desktop.
Save felipecastrosales/c1aa0c23f75f778009d5ffdbe9651404 to your computer and use it in GitHub Desktop.
my overlay
// error
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following assertion was thrown running a test:
Navigator operation requested with a context that does not include a Navigator.
The context used to push or pop routes from the Navigator must be that of a widget that is a
descendant of a Navigator widget.
// method
import 'package:dialog/overlayimage/overlay.dart';
import 'package:flutter/material.dart';
void showOverlayMethod(BuildContext context) {
Navigator.of(context).push(
MyOverlayImage(
foregroundColor: Colors.red.withOpacity(.5),
),
);
}
// test
import 'package:dialog/overlayimage/overlay.dart';
import 'package:dialog/show_overlay_method.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:network_image_mock/network_image_mock.dart';
class MockBuildContext extends Mock implements BuildContext {}
class MockNavigatorObserver extends Mock implements NavigatorObserver {}
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
late BuildContext mockContext;
late MockNavigatorObserver mockObserver;
setUp(() {
mockContext = MockBuildContext();
mockObserver = MockNavigatorObserver();
});
setUpAll(() {
registerFallbackValue(
MyOverlayImage(
foregroundColor: Colors.red.withOpacity(.5),
),
);
});
testWidgets('showOverlayMethod navigates to MyOverlayImage', (tester) async {
final myOverlay = MyOverlayImage(
foregroundColor: Colors.red.withOpacity(.5),
);
await mockNetworkImagesFor(
() => _createWidget(
tester: tester,
observer: mockObserver,
route: myOverlay,
context: mockContext,
child: TextButton(
onPressed: () => showOverlayMethod(mockContext),
child: const Text('Show Overlay'),
),
),
);
showOverlayMethod(mockContext);
final buttonFinder = find.byType(TextButton);
expect(buttonFinder, findsOneWidget);
await tester.tap(buttonFinder);
await tester.pumpAndSettle();
verify(() => mockObserver.didPush(any(), any())).called(1);
expect(find.byType(MyOverlayImage), findsOneWidget);
});
}
Future<void> _createWidget({
required WidgetTester tester,
required ModalRoute<void>? route,
required NavigatorObserver observer,
required BuildContext context,
required Widget child,
}) async {
await tester.pumpWidget(
MaterialApp(
navigatorObservers: [observer],
onGenerateRoute: (settings) {
return route;
},
home: Builder(
builder: (context) => child,
),
),
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment