在小部件测试中处理提供程序
Posted
技术标签:
【中文标题】在小部件测试中处理提供程序【英文标题】:Dispose provider in Widget Test 【发布时间】:2020-09-27 07:36:43 【问题描述】:我正在使用 flutter_test 在我的 Flutter 应用程序上执行一些小部件测试。 它基本上可以正常工作,除非我的测试小部件是消费者。
在这里,我基本上有一个 DeviceProvider 对象,它将一个对象包装到一个 ChangeNotifier 中,以便将更新正确地传播给消费者。
为了能够将它与 WidgetTester 一起使用,我将我的 Consumer 小部件放在了一个 ChangeNotifierProvider 中,它实例化了一个 DeviceProvider。
_pumpTestableWidgetWithProvider(WidgetTester tester, Widget widget) async
DeviceProvider device = DeviceProvider(Device());
await tester.pumpWidget(ChangeNotifierProvider(
create: (context) => device,
child: MaterialApp(home: widget)));
return device;
然后,我使用刚刚抽的 WidgetTester 并检查其中是否有一些文本字段。
testWidgets("Infos - default device infos", (WidgetTester tester) async
DeviceProvider device = await _pumpTestableWidgetWithProvider(
tester, DeviceInfos());
expect(find.text("Battery state: "), findsOneWidget);
);
它返回一个错误,告诉我“即使在小部件树被释放后,计时器仍处于挂起状态”。看日志,这个定时器对应一个用DeviceProvider创建的_FakeTimer。因此,我尝试使用
手动处置提供程序device.dispose();
但现在,我收到一条错误消息,告诉我“A DeviceProvider was used after being placed。”
有没有人可以帮我解决?
【问题讨论】:
我遇到了类似的问题。尝试测试使用提供程序的小部件,我在第二次测试时收到此错误... 您能否分享一个完整的 sn-p 以重现该错误? 【参考方案1】:最后,我发现了问题,我的 DeviceProvider 中运行了一个实际的计时器,而这个计时器没有被取消。
感谢您的支持!
【讨论】:
【参考方案2】:我能够在测试中为 changeNotifierProvider 使用不同的构造函数来解决它:
Widget buildWidget()
return ChangeNotifierProvider.value(
value: locator<TaNaLeiProvider>(),
child: MaterialApp(
home: Scaffold(
body: SizedBox(
width: 640,
child: DrawerTaNaLei(),
),
),
),
);
请注意,我使用的是 ChangeNotifierProvider.value 而不是 create。 我也在使用 getIt 在我的应用上创建单例。
locator.registerLazySingleton<TaNaLeiProvider>(() => TaNaLeiProvider());
希望有帮助!
【讨论】:
我也有类似的问题。我使用了 Stacked 和 GetIt,但我的小部件测试失败了?你能提供任何示例代码吗??以上是关于在小部件测试中处理提供程序的主要内容,如果未能解决你的问题,请参考以下文章