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
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!