1.问题
testWidgets
函数显然只是test
函数的一个子用例。
我现在尝试解决的一个用例是为多个testWidgets
和多个testWidgets
使用同一个widget,但是,如果它在每个测试中创建一个新示例,我该如何做呢?
我试过在main()
中的测试之外初始化一个WidgetTester
,但是WidgetTester
只有一个私有构造函数:
class WidgetTester
extends WidgetController
implements HitTestDispatcher, TickerProvider {
WidgetTester._(TestWidgetsFlutterBinding binding) : super(binding) {
if (binding is LiveTestWidgetsFlutterBinding)
binding.deviceEventDispatcher = this;
}
我不太明白Flutter团队是如何做到这一点的,但是用他们在testWidgets
函数中所做的相同方式初始化WidgetTester
对我来说是行不通的:
final TestWidgetsFlutterBinding binding
= TestWidgetsFlutterBinding.ensureInitialized()
as TestWidgetsFlutterBinding;
final WidgetTester tester = WidgetTester._(binding);
2.示例
一个简单的例子是尝试分解使用flutter create
中的每个新Flutter项目创建的Flutter演示的测试,在其中,我们可以尝试将应用的初始设置测试与点击动作测试分开:
testWidgets('Initial setup', (WidgetTester tester) async {
await tester.pumpWidget(MyApp());
expect(find.text('0'), findsOneWidget);
expect(find.text('1'), findsNothing);
});
testWidgets('Increment the counter on tap', (WidgetTester tester) async {
await tester.pumpWidget(MyApp());
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
expect(find.text('0'), findsNothing);
expect(find.text('1'), findsOneWidget);
});
我们的想法是尝试将await tester.pumpWidget(MyApp());
移动到setUp
函数中。
2条答案
按热度按时间v440hwme1#
下面是目前在Flutter中解决这个问题的方法。
总结如下:
1.在
main()
中创建group(..)
结构WidgetTester
示例async
testWidgets(..)
的调用await
调用其中的每一个,这样它们就不会并发运行到目前为止,我还没有找到一种方法让输出指示它运行的每个"子测试",所以现在只使用
print(...)
语句。这是一些QR码逻辑的演示:
感谢:https://iiro.dev/2018/08/22/writing-widget-tests-for-navigation-events/
test/navigation_test.dart
====
再次感谢,因为这个例子中包含的导航测试逻辑要感谢@iiro的帖子:https://stackoverflow.com/a/51983194/2162226
下面是
appRoutes.dart
文件:wztqucjr2#
答案是
setUpAll()
函数。首先在main方法中使用它,在group
之外,它只运行一次。