在Widget测试中配置提供程序

时间:2020-06-08 10:49:14

标签: flutter flutter-test flutter-provider

我正在使用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。”

有人对我有解决方案吗?

2 个答案:

答案 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中运行了一个实际计时器,并且该计时器未取消。

感谢您的支持!