Как протестировать виджеты Flutter на экранах разных размеров? - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть виджет Flutter, который показывает дополнительные данные в зависимости от размера экрана.Кто-нибудь знает способ тестирования этого виджета на экранах разных размеров?

Я просмотрел исходный код widget_tester , но ничего не нашел.

Ответы [ 4 ]

0 голосов
/ 27 марта 2019
Решение

@ rémi-rousselet работает отлично!

Кроме того, если вы хотите проверить изменение ориентации, попробуйте следующее:

const double PORTRAIT_WIDTH = 400.0;
const double PORTRAIT_HEIGHT = 800.0;
const double LANDSCAPE_WIDTH = PORTRAIT_HEIGHT;
const double LANDSCAPE_HEIGHT = PORTRAIT_WIDTH;

final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized();

await binding.setSurfaceSize(Size(PORTRAIT_WIDTH, PORTRAIT_HEIGHT));
await tester.pumpWidget(MyWidget());

// test in portrait

await binding.setSurfaceSize(Size(LANDSCAPE_WIDTH, LANDSCAPE_HEIGHT));
await tester.pumpAndSettle();

// OrientationBuilder gets triggered

// test in landscape
0 голосов
/ 11 декабря 2018

Хотя ответ @ Rémi Rousselet был очень полезным, он не полностью решил мою проблему.Оказывается, я могу просто обернуть тестируемый виджет в виджет MediaQuery и установить размер.

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  Widget makeTestableWidget({Widget child, Size size}) {
    return MaterialApp(
      home: MediaQuery(
        data: MediaQueryData(size: size),
        child: child,
      ),
    );
  }

  testWidgets("tablet", (tester) async {
    final testableWidget = makeTestableWidget(
      child: WidgetUnderTest(),
      size: Size(1024, 768),
    );

    ...
  });

  testWidgets("phone", (tester) async {
    final testableWidget = makeTestableWidget(
      child: WidgetUnderTest(),
      size: Size(375, 812),
    );

    ...
  });
}
0 голосов
/ 05 марта 2019

Не знаю почему, но решение @ rémi-rousselet у меня не сработало.Я должен был указать размер экрана, используя binding.window.physicalSizeTestValue и binding.window.devicePixelRatioTestValue, чтобы вывод был полностью детерминированным

Я добавил немного больше кода для начинающих трепетать, как я.Проверьте это:

void main() {

  final TestWidgetsFlutterBinding binding =
    TestWidgetsFlutterBinding.ensureInitialized();

  testWidgets("Basic layout test (mobile device)", (tester) async {
    binding.window.physicalSizeTestValue = Size(400, 200);
    binding.window.devicePixelRatioTestValue = 1.0;

    await tester.pumpWidget(new MyApp());

    expect(find.byType(MyHomePage), findsOneWidget);
    // etc.
  });
}
0 голосов
/ 10 декабря 2018

Пользовательский размер поверхности можно указать с помощью TestWidgetsFlutterBinding

Следующий код запустит тест с размером экрана 42x42

import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  final TestWidgetsFlutterBinding binding =
      TestWidgetsFlutterBinding.ensureInitialized();

  testWidgets("foo", (tester) async {
    await binding.setSurfaceSize(Size(42, 42));

    // TODO: do something
  });
}
...