Tom*_*yan 2 testing unit-testing dart flutter flutter-test
我有一个动态表单系统,它基于 json 构建小部件。可以解析的组件之一是复选框,并传递默认值来确定它最初是否被选中/取消选中。我正在为此编写一个单元测试,但遇到了语义问题。
我的测试从检查小部件是否已构建开始(以下测试成功)
//create form
await tester.pumpWidget(buildTestableWidget(testWidget));
//setup Finder
Finder widgetFinder = find.widgetWithText(FormCheckbox, "test checkbox");
//test for widget
expect(widgetFinder, findsOneWidget);
Run Code Online (Sandbox Code Playgroud)
班级FormCheckbox如下
class FormCheckbox extends StatefulWidget {
final forms.Checkbox component;
FormCheckbox(this.component) : super(key: Key("${component.propertyKey().getId()}"));
_FormCheckboxState createState() => _FormCheckboxState(component);
}
class _FormCheckboxState extends State<FormCheckbox> {
_FormCheckboxState(this._component) {
this.boxValue = _component.isDefaultSelected();
}
final forms.Checkbox _component;
bool boxValue;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(left: 16, right: 16, top: 6, bottom: 6),
child: ListTile(
leading: Material(
child: Checkbox(
value: boxValue,
onChanged: (bool newValue) {
setState(() {
boxValue = newValue;
});
})),
title: Text("${_component.getLabel()}"),
));
}
String validator(String value) {
//TODO: Implement validator
throw UnimplementedError();
}
}
Run Code Online (Sandbox Code Playgroud)
尽管有其他一切,它还是有一个Checkbox组件作为子组件,它默认为我可以设置的布尔值(我可以确认它肯定工作正常)。
我希望通过查看 flutter 自己的复选框测试,我可以使用getSemantics并期望它等于 amatchedSemantics其中isChecked = true如下所示
//test default value
expect(
tester.getSemantics(find.byType(Checkbox)),
matchesSemantics(
isChecked: true,
hasEnabledState: true,
isEnabled: true,
));
Run Code Online (Sandbox Code Playgroud)
然而,即使在点击之后, isChecked 状态仍保持为 falseawait tester.tap(find.byKey(Key("1")));
给出的错误信息是
Expected: has semantics with actions: [] with flags: [
SemanticsFlag:SemanticsFlag.isChecked,
SemanticsFlag:SemanticsFlag.hasEnabledState,
SemanticsFlag:SemanticsFlag.isEnabled
]
Actual: SemanticsNode:<SemanticsNode#5(Rect.fromLTRB(0.0, 0.0, 800.0, 68.0), tags:
[RenderViewport.twoPane], flags: [hasEnabledState, isEnabled], label: "test checkbox",
textDirection: ltr)>
Which: flags were: [hasEnabledState, isEnabled]
Run Code Online (Sandbox Code Playgroud)
我在这里缺少什么?为什么创建的 Checkbox 对象的 value: true 没有给出 isChecked = true 的语义值
我找到了解决方案。
编辑:@brightknight08 评论后更新
final checkboxFinder = find.byKey(const Key('aKey'));
var checkbox = tester.firstWidget<Checkbox>(checkboxFinder);
expect(checkbox.value, false);
await tester.tap(checkboxFinder);
await tester.pump();
checkbox = tester.firstWidget<Checkbox>(checkboxFinder);
expect(checkbox.value, true);
Run Code Online (Sandbox Code Playgroud)
我认为它的工作方式与 相同find.byType(Checkbox)。
| 归档时间: |
|
| 查看次数: |
3880 次 |
| 最近记录: |