flutter - 如何在 Flutter 中为 Snack Bar 编写一个简单的测试?
问题描述
我很惊讶以前似乎没有人问过这个问题,这意味着答案可能很明显,但我有一个带有文本字段和按钮的屏幕。用户在文本字段中输入他们的电子邮件。然后按下按钮查看电子邮件是否在数据库中。然后程序会显示一个带有“成功”文本或“失败”文本(2 秒持续时间)的快餐栏。
这是我的代码(5行):
await driver.enterText(field, 'wrongemail@email.com');
var btn = find.widgetWithText(RaisedButton, 'SEND MY PASSWORD');
await driver.tap(btn);
await driver.pump();
expect(find.text( 'E-mail address not found!'), findsOneWidget);
当我在模拟器中使用该应用程序时,一切都很好,但在测试中最后一行抛出一个错误,指出它找不到匹配的小部件。我错过了什么?
解决方案
您是否将测试小部件包装在 Scaffold 中?仅当 Scaffold 是调用 SnackBar 的小部件的祖先时,才能显示 SnackBar。
例子:
void main() {
testWidgets('SnackBar control test', (WidgetTester tester) async {
const String helloSnackBar = 'Hello SnackBar';
const Key tapTarget = Key('tap-target');
await tester.pumpWidget(MaterialApp(
home: Scaffold(
body: Builder(
builder: (BuildContext context) {
return GestureDetector(
onTap: () {
Scaffold.of(context).showSnackBar(const SnackBar(
content: Text(helloSnackBar),
duration: Duration(seconds: 2),
));
},
behavior: HitTestBehavior.opaque,
child: Container(
height: 100.0,
width: 100.0,
key: tapTarget,
),
);
}
),
),
));
expect(find.text(helloSnackBar), findsNothing);
await tester.tap(find.byKey(tapTarget));
expect(find.text(helloSnackBar), findsNothing);
await tester.pump(); // schedule animation
expect(find.text(helloSnackBar), findsOneWidget);
});
来自:https ://github.com/flutter/flutter/blob/master/packages/flutter/test/material/snack_bar_test.dart
推荐阅读
- python - 尝试将多行中的列值混合/合并到单行中
- parsing - 将 slug 与 Nom 匹配
- vue.js - 2 方式绑定在 vuejs 中无法正常工作
- java - 从Java中的另一个数组中获取数组名称后,如何将其用作数组?
- python-3.x - 将 Pandas Dataframe 放入 influxDB
- c - 识别 /proc/mtrr 和 /proc/iomem 中的 DMA 内存?
- c# - 在集合中,每次我通过索引访问它时都会执行查找,还是编译掉?
- geolocation - 如何通过地理位置获取我的 shopify 商店访问者的国家/地区?
- linux - CMake find_package() 不尊重 CMAKE_MODULE_PATH
- c++ - 无法从无限循环开始创建非无限循环