Flutter 如何断言占位符文本在flatter小部件测试中消失?

Flutter 如何断言占位符文本在flatter小部件测试中消失?,flutter,flutter-test,Flutter,Flutter Test,假设我想断言,当我在搜索栏小部件中输入文本时,占位符文本将消失。这实际上只是测试颤振框架,但这是我试图理解如何进行小部件测试的第一个小部件测试,而且它不只是工作 测试以下SearchBar小部件: 导入“包装:颤振/材料.省道”; 常量边界半径_kborderadius=边界半径.all(半径.圆形(32.0)); 常量颜色_kBorderColor=Color(0xFF33BFCC); 类SearchBar扩展了无状态小部件{ 搜索栏({this.onClose,this.onChanged}

假设我想断言,当我在搜索栏小部件中输入文本时,占位符文本将消失。这实际上只是测试颤振框架,但这是我试图理解如何进行小部件测试的第一个小部件测试,而且它不只是工作

测试以下SearchBar小部件:

导入“包装:颤振/材料.省道”;
常量边界半径_kborderadius=边界半径.all(半径.圆形(32.0));
常量颜色_kBorderColor=Color(0xFF33BFCC);
类SearchBar扩展了无状态小部件{
搜索栏({this.onClose,this.onChanged});
最终功能关闭;
最终功能一旦改变;
@凌驾
小部件构建(构建上下文){
返回文本字段(
一旦改变:一旦改变,
装饰:输入装饰(
后缀:图标按钮(
图标:图标(Icons.close),
onPressed:onClose,
),
fillColor:Colors.white,
是的,
hintText:'搜索',
内容填充:边集。对称(垂直:10.0,水平:20.0),
边框:大纲输入边框(
边界半径:_kborderadius,
),
enabledBorder:OutlineInputBorder(
borderSide:borderSide(颜色:_kBorderColor,宽度:1.0),
边界半径:_kborderadius,
),
聚焦顺序:大纲输入边框(
borderSide:borderSide(颜色:_kBorderColor,宽度:2.0),
边界半径:_kborderadius,
),
),
);
}
}
以及该小部件的以下测试:

导入“包装:颤振/材料.省道”;
进口“包装:颤振试验/颤振试验.dart”;
导入“package:my_app/ui_components/search_bar.dart”;
void main(){
testWidgets('输入文本删除占位符文本',
(WidgetTester测试仪)异步{
等待测试人员。pumpWidget(MaterialApp(主页:Scaffold(body:SearchBar())));
等待tester.enterText(find.byType(TextField),'hi');
等待测试仪。泵和沉降器();
最终占位符查找器=find.text('Search');
final textFinder=find.text('hi');
expect(textFinder、findsOneWidget);
expect(占位符查找器,findsNothing);
});
}
此测试失败,因为仍找到“搜索”文本。看,他们似乎在使用不透明度技巧。如果我用同样的方法替换

expect(placeholderFinder, findsNothing);

其中
getOpacity
定义为:

double-getOpacity(WidgetTester测试仪、Finder){
回程测试仪
.小部件(
寻找祖先(
作者:finder,
匹配:按类型查找(FadeTransition),
),
)
不透明度
价值
}
我得到以下错误:

运行测试时引发了以下StateError: 坏状态:元素太多 引发异常时,这是堆栈: 0可编辑。单个(省道:核心/可编辑。省道:554:24) 1 WidgetController.widget(包:颤振测试/src/controller.dart:65:30)


有更好的方法吗?

您可以通过
firstWidget
获取小部件并进行测试

testWidgets('testname',(WidgetTester)异步{
//正在准备小部件。。。
最终查找器=按类型查找(FadeTransition)
expect(finder、findsOneWidget);
//获取文本对象
Text widget=tester.firstWidget(finder);
//验证属性
expect(widget.opacity.value,等于(0));
}

提示文本有一个动画。在文本字段中键入内容后,您是否尝试过执行
等待测试仪.pumpandsolite()
?我尝试过,谢谢您的建议。我将使用使用该提示文本的代码更新问题,但失败了。我刚刚测试了自己。确实,它不起作用,因为文本仍然存在(尽管未涂漆).但同时:这真的很重要吗?你在这里测试的是
TextField
的一个实现细节。我同意这是在测试框架-令人沮丧的是,即使是最基本的测试也需要黑客才能正常工作,在这种情况下,出于某种原因,工作方式与在TextFiel上运行的测试不同另一方面,这种类型的测试似乎没有提供太多的价值,因为您可以使用提供的方法运行的大多数测试实际上只是测试框架本身。或者,您可能希望使用黄金测试。它基本上是基于屏幕截图的测试(不需要模拟器)
expect(getOpacity(tester, placeholderFinder), 0.0);