Flutter 测试:测试构建时是否选中复选框

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 的语义值

lsa*_*don 5

我找到了解决方案。

编辑:@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)