我正在使用flutter_test在Flutter应用上执行一些小部件测试。 基本上可以正常工作,除非我的测试窗口小部件是使用者。
在这里,我基本上有一个DeviceProvider对象,该对象将一个对象包装到ChangeNotifier中,以便将更新正确传播到使用者。
为了能够将其与WidgetTester一起使用,我将Consumer窗口小部件放置在可以实例化DeviceProvider的ChangeNotifierProvider中。
_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();
但是现在,我遇到一个错误,告诉我“在处置后使用了DeviceProvider。”
有人对我有解决方案吗?
答案 0 :(得分:0)
我能够在测试中为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());
希望有帮助!
答案 1 :(得分:0)
最后,我发现了问题,我在DeviceProvider中运行了一个实际计时器,并且该计时器未取消。
感谢您的支持!