在 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 测试中模拟 TextField 上的按 ENTER