【问题标题】: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 以重现该错误?

标签: flutter flutter-test flutter-provider


【解决方案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&lt;TaNaLeiProvider&gt;(() =&gt; TaNaLeiProvider());

    希望有帮助!

    【讨论】:

    • 我也有类似的问题。我使用了 Stacked 和 GetIt,但我的小部件测试失败了?你能提供任何示例代码吗??
    猜你喜欢
    • 2019-12-31
    • 2016-03-19
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 2021-09-11
    相关资源
    最近更新 更多