Bloc: BLoC & Widget Tests ?

Created on 31 Mar 2020  ยท  5Comments  ยท  Source: felangel/bloc

Describe the bug

Hi.

We're using flutter_bloc in our application and currently are in the task of (re)adding widget tests to our UI components.

I'm trying to create a simple Widget Test, but I can't get the Widget build method to complete without throwing an Error because of a Bloc.

This is what my (simplified due to policies) test class looks like:


void main() {
  setUp(() {
    setupMocks();
    TestWidgetsFlutterBinding.ensureInitialized();
  });

  testWidgets("Foo Overview loads", (WidgetTester tester) async {
    configureDependencyInjectionForTesting(registerMocks);
    await tester.pumpWidget(buildFooWidget());
    await tester.pump(Duration(seconds: 5));
  });
}

The buildFooWidget() Method looks like following:

Widget buildFooWidget() {
  return MaterialApp(
    home: MultiBlocProvider(
      child: FooOverview(), // my widget which I want to test
      providers: [
        BlocProvider<OverviewBloc>(
          create: (context) => OverviewBloc.create(),
        ),
        BlocProvider<FooItemBloc>(
          create: (context) => FooItemBloc.create(),
        ),
      ],
    ),
  );
}

As you can see, I'm wrapping my widget which I want to test with a MultiBlocProvider to provide it with all the Blocs which it (or its children) is using.

However, when I run the test this is the output I get:

00:03 +45: C:\dev\foo\test\widget\foo_overview_widget_test.dart: Foo Overview loads
โ•โ•โ•ก EXCEPTION CAUGHT BY WIDGETS LIBRARY โ•žโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
The following assertion was thrown building FooListItem(state:
_FooListItemState#8dcfe):
        BlocProvider.of() called with a context that does not contain a Bloc of type
FooItemBloc.
        No ancestor could be found starting from the context that was passed to
BlocProvider.of<FooItemBloc>().

        This can happen if:
        1. The context you used comes from a widget above the BlocProvider.
        2. You used MultiBlocProvider and didn't explicity provide the BlocProvider types.

        Good: BlocProvider<FooItemBloc>(create: (context) => FooItemBloc())
        Bad: BlocProvider(create: (context) => FooItemBloc()).

        The context used was: BlocListener<FooItemBloc, FooItemState>(dirty, state:
_BlocListenerBaseState<FooItemBloc, FooItemState>#95e32(lifecycle state: created))


The relevant error-causing widget was:
  FooListItem
  file:///C:/dev/foo/lib/foo_overview/widgets/foo_list.dart:33:24

When the exception was thrown, this was the stack:
#0      BlocProvider.of (package:flutter_bloc/src/bloc_provider.dart:98:7)
#1      _BlocListenerBaseState.initState (package:flutter_bloc/src/bloc_listener.dart:147:41)
#2      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4355:58)
#3      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
#4      SingleChildWidgetElementMixin.mount (package:nested/nested.dart:223:11)
#5      Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
#6      Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
#7      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
#8      Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
#9      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
#10     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4381:11)
#11     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
#12     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
#13     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
#14     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
#15     _InheritedProviderScopeMixin.performRebuild (package:provider/src/inherited_provider.dart:220:11)
#16     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
#17     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
#18     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
#19     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
#20     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
#21     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
#22     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
#23     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
#24     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
#25     SingleChildWidgetElementMixin.mount (package:nested/nested.dart:223:11)
#26     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
#27     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
#28     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
#29     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
#30     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
#31     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
#32     SingleChildWidgetElementMixin.mount (package:nested/nested.dart:223:11)
#33     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
#34     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
#35     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
#36     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
#37     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
#38     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
#39     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
#40     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
#41     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5445:14)
#42     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
#43     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
#44     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5445:14)
#45     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
#46     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
#47     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
#48     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
#49     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
#50     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
#51     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
#52     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
#53     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
#54     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
#55     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
#56     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
#57     ParentDataElement.mount (package:flutter/src/widgets/framework.dart:4617:11)
#58     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
#59     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
#60     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
#61     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
#62     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
#63     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4381:11)
#64     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
#65     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
#66     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
#67     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4243:16)
#68     Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
#69     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4206:5)
#70     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
#71     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
#72     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
#73     SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:1288:36)
#74     SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1273:20)
#75     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2412:19)
#76     SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1266:11)
#77     RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_mul
ti_box_adaptor.dart:354:23)
#78     RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1823:58)
#79     PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:875:15)
#80     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1823:13)
#81     RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:
343:5)
#82     RenderSliverMultiBoxAdaptor.addInitialChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:427:5
)
#83     RenderSliverGrid.performLayout (package:flutter/src/rendering/sliver_grid.dart:543:12)
#84     RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
#85     RenderSliverEdgeInsetsPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:134:11)
#86     RenderSliverPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:373:11)
#87     RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
#88     RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:410:13)
#89     RenderShrinkWrappingViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1700:12)
#90     RenderShrinkWrappingViewport.performLayout (package:flutter/src/rendering/viewport.dart:1663:20)
#91     RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
#92     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
#93     RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
#94     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
#95     RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
#96     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
#97     RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
#98     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
#99     RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
#100    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
#101    RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
#102    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
#103    RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
#104    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
#105    RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
#106    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
#107    RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
#108    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
#109    RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
#110    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
#111    RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
#112    RenderFlex.performLayout (package:flutter/src/rendering/flex.dart:806:17)
#113    RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
#114    RenderPositionedBox.performLayout (package:flutter/src/rendering/shifted_box.dart:392:13)
#115    RenderObject.layout (package:flutter/src/rendering/object.dart:1724:7)
#116    MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:163:11)
#117    _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:477:7)
#118    MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:232:7)
#119    RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:391:14)
#120    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1584:7)
#121    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:844:18)
#122    AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:977:23)
#123    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:283:5)
#124    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1102:15)
#125    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1041:9)
#126    AutomatedTestWidgetsFlutterBinding.pump.<anonymous closure> (package:flutter_test/src/binding.dart:872:9)
#129    TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:69:41)
#130    AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:859:27)
#131    WidgetTester.pump.<anonymous closure> (package:flutter_test/src/widget_tester.dart:343:53)
#134    TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:69:41)
#135    WidgetTester.pump (package:flutter_test/src/widget_tester.dart:343:27)
#136    main.<anonymous closure> (file:///C:/dev/foo/test/widget/foo_overview_widget_test.
dart:67:18)
#150    AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1066:17)
#152    AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1054:35)
(elided 33 frames from class _FakeAsync, package dart:async, package dart:async-patch, and package stack_trace)

Any idea why this is happening? I'm not able to get the widget test working.

Any help is appreciated!

Thanks

question

All 5 comments

Hi @PDDStudio ๐Ÿ‘‹
Thanks for opening an issue!

Are you able to post a link to a sample app which reproduces the issue? It'd be much easier for me to help. Alternatively, if you'd like to message me on discord we can setup a live code share and address the issue that way ๐Ÿ‘

Closing for now since we worked through this via discord ๐Ÿ‘

@felangel it'd be really helpful if you could include some sort of documentation/guide for what the issue was. Other people are likely to encounter the same issue and so it'll save you time in the long run to have a record of what the issue was. Either as part of issues or documentation

@PDDStudio are you able to share the what the solution was? I unfortunately don't remember the details of this specific case ๐Ÿ˜ž

Hey @felangel ,
unfortunately there's no Code which I can share.
There's no particular fix for this issue, it's just a matter of how you attempt to solve it.
In our case, the widget test was simply testing too many widgets & nested blocs.
We could resolve this by splitting up the widget tests into smaller pieces.

Hope this helps!

Was this page helpful?
0 / 5 - 0 ratings

Related issues

rsnider19 picture rsnider19  ยท  3Comments

nhwilly picture nhwilly  ยท  3Comments

timtraversy picture timtraversy  ยท  3Comments

hivesey picture hivesey  ยท  3Comments

abinvp picture abinvp  ยท  3Comments