在 Flutter 测试中模拟一个 Widget

Posted

技术标签:

【中文标题】在 Flutter 测试中模拟一个 Widget【英文标题】:Mock a Widget in Flutter tests 【发布时间】:2021-02-09 11:17:24 【问题描述】:

我正在尝试为我的 Flutter 应用程序创建测试。简单例子:

class MyWidget extends StatelessWidget 
   @override
   build(BuildContext context) 
      return MySecondWidget();
   

我想验证 MyWidget 实际上是在调用 MySecondWidget 而不构建 MySecondWidget

void main() 
   testWidgets('It should call MySecondWidget', (WidgetTester tester) async 
      await tester.pumpWidget(MyWidget());
      expect(find.byType(MySecondWidget), findsOneWidget);
   

在我的情况下,这不起作用,因为MySecondWidget 需要一些特定且复杂的设置(如 API 密钥、Provider 中的值...)。我想要 "mock" MySecondWidget 是一个空的 Container(例如),这样它就不会在测试期间引发任何错误。

我该怎么做?

【问题讨论】:

你最终弄清楚了吗? 恐怕不太容易做到 【参考方案1】:

您可以模拟MySecondWidget(例如使用Mockito),但在测试模式下您确实需要更改您的真实代码以创建MockMySecondWidget,所以它并不漂亮。 Flutter 不支持基于 Type 的对象实例化(通过 dart:mirrors 除外,但这与 Flutter 不兼容),因此您不能将类型“注入”为依赖项。要确定您是否处于测试模式,请使用 Platform.environment.containsKey('FLUTTER_TEST') - 最好在启动时确定一次并将结果设置为全局 final 变量,这将使任何条件语句都变得快速。

【讨论】:

以上是关于在 Flutter 测试中模拟一个 Widget的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Mockito 测试模拟失败

如何在集成测试中模拟 BLoC

如何在 Flutter 测试中模拟 TextField 上的按 ENTER

如何在开发过程中同时使用 Android 和 IOS 模拟器来测试我的 Flutter 应用程序?

VSCode运行flutter启动模拟器

如何在 Visual Studio Code 中为 Flutter 添加 iOS 模拟器?