我正在尝试使用flutter进行一些TDD测试,当测试运行时,如果按钮在抽屉里,点击按钮是不起作用的。
在下面的例子中,我们按下两个按钮,在控制台中打印一条消息。下面是操作:
找到并点击支架上的按钮:好的
打开抽屉:好的
在抽屉中定位按钮:好的
轻触抽屉按钮:"什么都没发生"
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('Test that drawer is apparing and we can click on button',
(WidgetTester tester) async {
final scaffoldKey = GlobalKey<ScaffoldState>();
await tester.pumpWidget(new MaterialApp(
title: 'Where Assistant',
home: Scaffold(
key: scaffoldKey,
body: Column(
children: <Widget>[
Text('test text'),
RaisedButton(
onPressed: () {
print('OK on main screen');
},
child: Icon(Icons.access_alarm),
),
],
),
drawer: Drawer(
// Add a ListView to the drawer. This ensures the user can scroll
// through the options in the Drawer if there isn't enough vertical
// space to fit everything.
child: ListView(
// Important: Remove any padding from the ListView.
padding: EdgeInsets.zero,
children: <Widget>[
DrawerHeader(
child: Text('Drawer Header'),
decoration: BoxDecoration(
color: Colors.blue,
),
),
ListTile(
title: Text('Item 2'),
onTap: () {
// Update the state of the app
// ...
},
),
RaisedButton(
onPressed: () {
print('OK drawer');
},
child: Icon(Icons.add),
)
],
),
),
),
));
await tester.pump();
expect(find.text('test text'), findsOneWidget);
expect(find.byIcon(Icons.access_alarm), findsOneWidget);
await tester.tap(find.byIcon(Icons.access_alarm));
expect(find.byIcon(Icons.add), findsNothing);
scaffoldKey.currentState.openDrawer();
await tester.pump(); // drawer should appear
expect(find.text('Item 2'), findsOneWidget);
expect(find.byIcon(Icons.add), findsOneWidget);
await tester.tap(find.byIcon(Icons.add));
print('end of test');
});
}
6条答案
按热度按时间lztngnrs1#
我也遇到了类似的问题。
测试人员能够在抽屉中找到FlatButton:
tap似乎不工作:
但是Flutter issue中提到的解决方案确实起作用了:
vatpfxk52#
终于找到了一个解决办法:只需要在敲抽屉之前加一些延迟。
所以我加了一句
在点击按钮之前
vjrehmav3#
我还没有玩过
WidgetTest
,但我能够实现点击抽屉内的按钮,与Flutter驱动程序。在
main.dart
中,我使用了key
属性作为要点击的RaisedButton
。fhg3lkii4#
我的问题是
GestureDetector
的onTap
回调在Widget树中太深,我最终创建了一个新的
stateless Widget
类型,它直接 PackageGestureListener
并将必要的数据传递到那里。所以
find.byWidgetPredicate((widget) => widget is ActionClickableButton).first
起作用了。ecr0jaav5#
等待抽屉 * 完全打开 *
抽屉打开是一个动画,随着时间的推移滑出。
在抽屉完全展开之前,我们不应该尝试测试里面的小部件。
pumpAndSettle()
或启动.openDrawer()
后的“双泵”是两种解决方案。pumpAndSettle()
...或
双
pump()
scaffoldState.openDrawer();
泵送和沉降()
await tester.pumpAndSettle();
binder.hasScheduledFrame
为false时返回(没有更多动画帧,从抽屉打开***或其他动画***)双泵()
await tester.pump();
await tester.pump(const Duration(seconds: 1);
pump()
(再次)“渲染”当前情况的一帧之前,***会等待一整秒。(这不能单独用于启动和等待动画完成,因为这会等待1秒过去***然后***调用pump()
一次。这只会 * 启动 * 动画。)pump()
启动的动画有1000毫秒(大部分跳过的帧)要完成bf1o4zei6#
试试这个代码..这是工作抽屉点击..