Home > Software design >  Flutter Widget Test: AutoRouter operation requested with a context that does not include an AutoRout
Flutter Widget Test: AutoRouter operation requested with a context that does not include an AutoRout

Time:08-14

I'm using the auto_route package in my flutter project and wrapped my App in MaterialApp.router.

Now I want to test a widget which calls AutoRouter.of(context).pop(); in one place.

My test looks like this:

 testWidgets('my widget test',
     (WidgetTester tester) async {
   await tester.pumpWidget(
     MaterialApp(
       home: MyWidget(),
     ),
   );
 });

Pumping the widget understandably throws the following error message:

AutoRouter operation requested with a context that does not include an AutoRouter. The context used to retrieve the Router must be that of a widget that is a descendant of an AutoRouter widget.

So I somehow need to provide an AutoRouter instance above my widgetin my test.

My widget also uses MediaQuery and I needed to wrap my tested widget inside MaterialApp to avoid an error which was thrown due to MediaQuery.of(context) lookup.

I guess I need to do something similar with AutoRouter but couldn't figure it out yet. Is there something like a MockAutoRouter?

Happy for any help.

CodePudding user response:

Okay I got it working.

AutoRouter.of(context) looks up an instance of StackRouter which is provided through StackRouterScope. So I mocked StackRouter and provided it via StackRouterScope:

@GenerateMocks([StackRouter])

...

await tester.pumpWidget(
  StackRouterScope(
    controller: MockStackRouter(),
    stateHash: 0,
    child: MyWidget(),
  ),
);

Now AutoRouter.of(context).pop() does not throw anymore.

It should also be possible now to stub the MockStackRouter and verify if e.g. pop is called.

  • Related