对下拉菜单中的项目进行颤振测试find.byValueKey()不起作用

时间:2019-10-22 11:26:12

标签: flutter dart

我的测试未在带有值键的下拉菜单中找到该项目。 它与getText()和值一起使用。

我创建了一个动态函数来为每个项目填充一个值,一个子项带有Text(value),而一个键则带有Key('sign_$value_item');

这是我在应用程序中的完整表单:

  static const menuSigns = <String>[
    'aries',
    'taurus',
    'gemini',
    'cancer',
    'leo',
    'virgo',
    'libra',
    'scorpio',
    'sagittarius',
    'capricorn',
    'aquarius',
    'pisces'
  ];

  final List<DropdownMenuItem<String>> _dropDownMenuSigns = menuSigns
      .map<DropdownMenuItem<String>>((String value) => DropdownMenuItem<String>(
            key: new ValueKey('sign_$value_item'), // i even try with new Key('sign_$value')
            value: value,
            child: new Text(value),
          ))
      .toList();

@override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Container(
        margin: EdgeInsets.fromLTRB(_hPad, 16.0, _hPad, 0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Center(
              child: Container(
                padding: EdgeInsets.fromLTRB(0, 0, 0, 16.0),
                width: CustomTheme.customFormSize.width(context),
                child: DropdownButton(
                  key: Key('sign_list'),
                  isExpanded: true,
                  value: _sign,
                  style: CustomTheme.style.dropDownMenu(context),
                  hint: Text('Choose a sign'),
                  icon: Icon(Icons.arrow_drop_down_circle),
                  onChanged: ((newValue) {
                    setState(() {
                      _sign = newValue;
                    });
                  }),
                  items: _dropDownMenuSigns,
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

奇怪的是,如果值的长度很长,例如10个字符以上,则测试可以使用Key。

这是我的测试:

import 'package:flutter_driver/flutter_driver.dart';
import 'package:flutter_gherkin/flutter_gherkin.dart';
import 'package:gherkin/gherkin.dart';

class AstroSignValidation extends AndWithWorld<FlutterWorld> {
  @override
  Future<void> executeStep() async {
    await FlutterDriverUtils.getText(world.driver, find.text('AstroDay'));
    await FlutterDriverUtils.tap(world.driver, find.byValueKey('sign_list')); // open drop down menu is ok
    await FlutterDriverUtils.tap(world.driver, find.byValueKey('sign_cancer_item')); // here test not passed
  }

  RegExp get pattern => RegExp(r"I expect the user enters sign");
}

编辑:这是我的功能文件:

Feature: Get Astro day
  User should be able to get successfully his astro after cliking astro button.

  Scenario: User get astro in successfully
    Given I expect the "user" 1 sign
    And I expect the user enters day
    When user hits Show your astro button
    Then user should land on result screen

1 个答案:

答案 0 :(得分:0)

我重新审理了你的案子。无需在key上使用DropdownMenuItem属性,而是需要在它的子元素内使用它,即在Text小部件中使用。这样,由于当下拉菜单打开时,颤振驱动程序会寻找要选择的文本,因此在显示菜单项时key属性将起作用,然后更容易单击测试中通过的任何选项。运行良好。更新了下面的工作代码:

final List<DropdownMenuItem<String>> _dropDownMenuSigns = menuSigns
      .map<DropdownMenuItem<String>>((String value) => DropdownMenuItem<String>(
  //  key: new ValueKey('sign_$value'),
    value: value,
    child: new Text(value, key: Key('sign_$value'),),  // use key here on text
  ))
      .toList();

驱动程序测试:

class AstroSignValidation extends GivenWithWorld<FlutterWorld> {
  @override
  Future<void> executeStep() async {
    await FlutterDriverUtils.getText(world.driver, find.text('Choose a sign'));
    await FlutterDriverUtils.tap(world.driver, find.byValueKey('sign_list')); // open drop down menu is ok
    await FlutterDriverUtils.tap(world.driver, find.byValueKey('sign_virgo')); // selects sign properly
    print('selected sign');
  }

  RegExp get pattern => RegExp(r"I expect the user enters sign");
}

并且测试通过:

enter image description here

注意:我直接在功能文件中使用了Given语句,并因此在测试中扩展了GivenWithWorld类。您需要根据需要使用它。

希望这可以回答您的问题。