Тестирование виджета флаттера - без клавиатуры - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь проверить свой виджет с состоянием CheckedTextField:

class _CheckedTextFieldState extends State<CheckedTextField> {
  TextEditingController _controller = TextEditingController();
  bool _checked;
  String _valueBackup;

  @override
  void initState() {
    super.initState();
    _checked = widget.initialChecked;
    _controller.text = widget.initialValue;
    _controller.addListener(invokeCallback);
  }

  invokeCallback() {
    widget.callback(_controller.text.trim(), _checked);
  }

  @override
  Widget build(BuildContext context) {
    return Row(
      children: <Widget>[
        Expanded(
          child: TextField(
            enabled: _checked,
            controller: _controller,
            decoration: widget.decoration,
          ),
        ),
        Checkbox(
          onChanged: (value) {
            if (value == false) {
              _valueBackup = _controller.text;
              _controller.text = "";
            }
            if (value == true) {
              _controller.text = _valueBackup;
            }
            setState(() {
              _checked = value;
            });
            invokeCallback();
          },
          value: _checked,
        ),
      ],
    );
  }
}

Когда я пытаюсь проверить виджет с помощью следующего кода, движок говорит мне показать клавиатуру первое:

testWidgets('enter text when not checked', (WidgetTester tester) async {
  String value = "";
  bool checked = false;
  await tester.pumpWidget(
    wrapMaterial(
      CheckedTextField(
        initialValue: value,
        initialChecked: checked,
        callback: (_value, _checked) {
          value = _value;
          checked = _checked;
        },
      ),
    ),
  );

  await tester.enterText(find.byType(TextField), "newText");

  expect(value, "newText");
  expect(checked, isFalse);
});

Я уже пытался вручную отобразить клавиатуру с помощью await tester.showKeyboard(find.byType(TextField)); перед вводом текста, но проблема все еще остается.

Я также написал предикат поиска, чтобы убедиться, что TextField найден, поэтому проблема, кажется, где-то еще.

Брошенное исключение:

══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following TestFailure object was thrown running a test:
  Tried to use TestTextInput with no keyboard attached. You must use WidgetTester.showKeyboard() first.

When the exception was thrown, this was the stack:
#0      TestTextInput.updateEditingValue (package:flutter_test/src/test_text_input.dart:133:7)
#1      TestTextInput.enterText (package:flutter_test/src/test_text_input.dart:170:5)
#2      WidgetTester.enterText.<anonymous closure> (package:flutter_test/src/widget_tester.dart:875:21)
<asynchronous suspension>
#3      WidgetTester.enterText.<anonymous closure> (package:flutter_test/src/widget_tester.dart)
#6      TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#7      WidgetTester.enterText (package:flutter_test/src/widget_tester.dart:873:27)
#8      main.<anonymous closure> (file:///home/kevin/Projekte/Blackout/test/widget/checked_text_field/checked_text_field_test.dart:54:18)
<asynchronous suspension>
#9      main.<anonymous closure> (file:///home/kevin/Projekte/Blackout/test/widget/checked_text_field/checked_text_field_test.dart)
#10     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:140:29)
<asynchronous suspension>
#11     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart)
#12     TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:703:19)
<asynchronous suspension>
#15     TestWidgetsFlutterBinding._runTest (package:flutter_test/src/binding.dart:683:14)
#16     AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1083:24)
#17     FakeAsync.run.<anonymous closure>.<anonymous closure> (package:fake_async/fake_async.dart:177:54)
#22     withClock (package:clock/src/default.dart:46:10)
#23     FakeAsync.run.<anonymous closure> (package:fake_async/fake_async.dart:177:22)
#28     FakeAsync.run (package:fake_async/fake_async.dart:177:7)
#29     AutomatedTestWidgetsFlutterBinding.runTest (package:flutter_test/src/binding.dart:1080:15)
#30     testWidgets.<anonymous closure> (package:flutter_test/src/widget_tester.dart:133:24)
#31     Declarer.test.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:172:27)
<asynchronous suspension>
#32     Declarer.test.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart)
#33     Invoker.waitForOutstandingCallbacks.<anonymous closure> (package:test_api/src/backend/invoker.dart:246:15)
#38     Invoker.waitForOutstandingCallbacks (package:test_api/src/backend/invoker.dart:243:5)
#39     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:170:33)
#44     Declarer.test.<anonymous closure> (package:test_api/src/backend/declarer.dart:169:13)
#45     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:400:30)
(elided 36 frames from class _RawReceivePortImpl, class _Timer, dart:async, dart:async-patch, and package:stack_trace)

The test description was:
  enter text when not checked
════════════════════════════════════════════════════════════════════════════════════════════════════
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...