在小部件测试中处理提供程序

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&lt;TaNaLeiProvider&gt;(() =&gt; TaNaLeiProvider());

希望有帮助!

【讨论】:

我也有类似的问题。我使用了 Stacked 和 GetIt,但我的小部件测试失败了?你能提供任何示例代码吗??

以上是关于在小部件测试中处理提供程序的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:在小部件测试中测试异常

在小部件构建完成之前运行方法?

如何在小部件测试中找到屏幕外的 ListView 子项?

如何在小部件测试期间存根不属于类的函数?

在小部件测试期间检查颜色?

Flutter - 如何在小部件测试中选择 DropdownButton 项