Baseflow / flutter_cached_network_image

Download, cache and show images in a flutter app
https://baseflow.com
2.43k stars 653 forks source link

Tests throw an exception #432

Open expilu opened 4 years ago

expilu commented 4 years ago

๐Ÿ› Bug Report

The plugin throws an exception when doing tests with testWidgets. The tests don't fail as the exception is thrown after it completes. But it leaves a lot of console spam like this:

`โ•โ•โ•ก EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK โ•žโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• The following MissingPluginException was thrown running a test (but after the test had completed): MissingPluginException(No implementation found for method getDatabasesPath on channel com.tekartik.sqflite)

When the exception was thrown, this was the stack:

0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:154:7)

#1 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:329:12) #2 invokeMethod (package:sqflite/src/sqflite_impl.dart:17:13) #3 SqfliteDatabaseFactoryImpl.invokeMethod (package:sqflite/src/factory_impl.dart:82:7) #4 SqfliteDatabaseFactoryMixin.safeInvokeMethod. (package:sqflite_common/src/factory_mixin.dart:25:35) #5 wrapDatabaseException (package:sqflite/src/exception_impl.dart:7:32) #6 SqfliteDatabaseFactoryImpl.wrapDatabaseException (package:sqflite/src/factory_impl.dart:78:7) #7 SqfliteDatabaseFactoryMixin.safeInvokeMethod (package:sqflite_common/src/factory_mixin.dart:25:7) #8 SqfliteDatabaseFactoryMixin.getDatabasesPath (package:sqflite_common/src/factory_mixin.dart:143:26) #9 getDatabasesPath (package:sqflite/sqflite.dart:168:54) #10 CacheStore._getObjectProvider (package:flutter_cache_manager/src/cache_store.dart:43:33) #11 new CacheStore (package:flutter_cache_manager/src/cache_store.dart:39:49) #12 BaseCacheManager._createCacheStore (package:flutter_cache_manager/src/cache_manager.dart:263:12) #13 new BaseCacheManager (package:flutter_cache_manager/src/cache_manager.dart:84:28) #14 new DefaultCacheManager._ (package:flutter_cache_manager/src/cache_manager.dart:40:29) #15 new DefaultCacheManager (package:flutter_cache_manager/src/cache_manager.dart:36:39) #16 CachedNetworkImageState._cacheManager (package:cached_network_image/src/cached_image_widget.dart:404:35) #17 CachedNetworkImageState._createFileStream (package:cached_network_image/src/cached_image_widget.dart:242:19) #18 CachedNetworkImageState.initState (package:cached_network_image/src/cached_image_widget.dart:219:5) #19 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4640:58) #20 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4476:5) ... Normal element mounting (39 frames) #59 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14) #60 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5947:32) ... Normal element mounting (36 frames) #96 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14) #97 Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18) #98 SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:1162:36) #99 SliverMultiBoxAdaptorElement.createChild. (package:flutter/src/widgets/sliver.dart:1147:20) #100 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2607:19) #101 SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1140:11) #102 RenderSliverMultiBoxAdaptor._createOrObtainChild. (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:354:23) #103 RenderObject.invokeLayoutCallback. (package:flutter/src/rendering/object.dart:1866:58) #104 PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:918:15) #105 RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1866:13) #106 RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:343:5) #107 RenderSliverMultiBoxAdaptor.addInitialChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:427:5) #108 RenderSliverFixedExtentBoxAdaptor.performLayout (package:flutter/src/rendering/sliver_fixed_extent_list.dart:197:12) #109 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #110 RenderSliverEdgeInsetsPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:135:11) #111 _RenderSliverFractionalPadding.performLayout (package:flutter/src/widgets/sliver_fill.dart:168:11) #112 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #113 RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:452:13) #114 RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1444:12) #115 RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1353:20) #116 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #117 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #118 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #119 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #120 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #121 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #122 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #123 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #124 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #125 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #126 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #127 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #128 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #129 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #130 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #131 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #132 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #133 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #134 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #135 RenderStack.performLayout (package:flutter/src/rendering/stack.dart:556:15) #136 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #137 RenderConstrainedBox.performLayout (package:flutter/src/rendering/proxy_box.dart:266:13) #138 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #139 RenderFlex.performLayout (package:flutter/src/rendering/flex.dart:746:15) #140 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #141 _RenderSingleChildViewport.performLayout (package:flutter/src/widgets/single_child_scroll_view.dart:512:13) #142 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #143 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #144 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #145 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #146 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #147 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #148 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #149 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #150 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #151 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #152 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #153 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #154 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #155 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #156 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #157 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #158 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #159 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #160 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #161 MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:171:11) #162 _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:484:7) #163 MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:240:7) #164 RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:399:14) #165 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #166 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #167 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #168 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #169 _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1248:11) #170 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #171 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #172 RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7) #173 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13) #174 RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1630:7) #175 PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:887:18) #176 AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:1009:23) #177 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:284:5) #178 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1113:15) #179 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1052:9) #180 AutomatedTestWidgetsFlutterBinding.pump. (package:flutter_test/src/binding.dart:879:9) #183 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41) #184 AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:866:27) #185 WidgetTester.pumpAndSettle. (package:flutter_test/src/widget_tester.dart:542:23) #186 WidgetTester.pumpAndSettle. (package:flutter_test/src/widget_tester.dart:537:39) #189 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41) #190 WidgetTester.pumpAndSettle (package:flutter_test/src/widget_tester.dart:537:27) #191 main.... (file:///C:/code/baltics-flutter/test/product_screen_test.dart:46:24) (elided 16 frames from dart:async and package:stack_trace)` ### Expected behavior To not throw an exception when used on tests. ### Reproduction steps Just add a `CachedNetworkImage` to a widget and write a test for it with `testWidgets`. ### Configuration **Platform:** - [X] :iphone: iOS - [X] :robot: Android
ncuillery commented 4 years ago

In my case, the test fails.

Maybe because I'm doing golden testing.

await expectLater(
  find.byType(MyWidgetUsingCachedNetWorkImage),
  matchesGoldenFile('main.png'),
);
kjuchnowicz commented 4 years ago

I have exact same problem with widget tests while using CachedNetworkImage widget.

zb666 commented 4 years ago

+1

ncuillery commented 4 years ago

This blog post might help: https://medium.com/flutter-community/golden-testing-using-cachednetworkimage-1b488c653af3

hampsterx commented 4 years ago

followed that blog post but still getting issue, seems base class is trying to create http client.

  Tried calling: printOnFailure("Warning: At least one test in this suite creates an HttpClient. When\nrunning a test suite that uses TestWidgetsFlutterBinding, all HTTP\nrequests will return status code 400, and no network request will\nactually be made. Any test expecting a real network connection and\nstatus code will fail.\nTo test code that needs an HttpClient, provide your own HttpClient\nimplementation to the code under test, so that your test can\nconsistently provide a testable response to the code under test.")
  package:test_api                                                            printOnFailure
  package:flutter_test/src/_binding_io.dart 83:7                              _MockHttpOverrides.createHttpClient
  dart:_http                                                                  new HttpClient
  package:http/src/io_client.dart 23:52                                       new IOClient
  package:http/src/io_client.dart 16:30                                       createClient
  package:http/src/client.dart 35:23                                          new Client
  package:flutter_cache_manager/src/web/file_service.dart 24:38               new HttpFileService
  package:flutter_cache_manager/src/web/web_helper.dart 24:39                 new WebHelper
  package:flutter_cache_manager/src/cache_manager.dart 91:31                  new BaseCacheManager
  custom_cache_manager.dart 9:9                                               new TestCacheManager

hmm seems to work if add the GetIt call inside a setUpAll method in the test. Still having test hang however but suspect that is probably due to using it with golden_toolkit.

uzumaki258 commented 4 years ago

I have exact same problem with widget tests while using CachedNetworkImage widget.

me too.

naresh2052 commented 2 years ago

Because cached_network_image >=3.2.0 depends on flutter_cache_manager ^3.3.0 which depends on sqflite ^2.0.0+3, cached_network_image >=3.2.0 requires sqflite from hosted. So, because app depends on both cached_network_image ^3.2.1 and sqflite from git, version solving failed.

i faced this error plz any one help me

zb666 commented 2 years ago

ไฝ ๅฅฝ๏ผŒ้‚ฎไปถๅทฒ็ปๆ”ถๅˆฐ๏ผŒ่ฐข่ฐข