Как найти внеэкранного ListView дочернего элемента в тестах виджетов? - PullRequest
0 голосов
/ 12 февраля 2019

При отображении нескольких дочерних элементов в ListView, если дочерний элемент находится за пределами экрана, он не может быть обнаружен тестом виджета.Вот полный пример:

main.dart

import 'package:flutter/material.dart';

void main() => runApp(App());

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: Scaffold(body: Test()));
  }
}

class Test extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ListView(
      children: <Widget>[
        Container(
          height: 600,
          color: Colors.red,
        ),
        Text("Find me!"),
      ],
    );
  }
}

main_test.dart

import 'package:flutter_app/main.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets("Find text", (WidgetTester tester) async {
    final testableWidget = App();

    await tester.pumpWidget(testableWidget);

    expect(find.text("Find me!"), findsOneWidget);
  });
}

Этот тест не пройден, однако, если я изменю высоту Containerв main.dart к 599 это работает.

Кто-нибудь знает, почему это происходит?Это ошибка?Есть ли способ обойти это?

1 Ответ

0 голосов
/ 12 февраля 2019

Тесты должны вести себя так, как должно работать ваше приложение, иначе ваши тесты станут бесполезными (поскольку вы не тестируете реальное поведение).Таким образом, это не ошибка.

Вы должны вручную прокрутить ListView внутри ваших тестов, чтобы загрузить больше виджетов.

Это можно сделать с помощью tester:

final gesture = await tester.startGesture(Offset.zero /* THe position of your listview */ );
// Manual scroll
await gesture.moveBy(const Offset(0, 100));

await tester.pump(); // flush the widget tree 
...