Flutter 如何在不同的屏幕大小上测试颤振小部件?

Flutter 如何在不同的屏幕大小上测试颤振小部件?,flutter,flutter-test,Flutter,Flutter Test,我有一个flatter小部件,它根据屏幕大小显示额外的数据。有人知道在多个不同的屏幕大小上测试这个小部件的方法吗 我查看了源代码,但找不到任何内容。您可以使用 以下代码将运行屏幕大小为42x42的测试 import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets("foo", (tester) async { test

我有一个flatter小部件,它根据屏幕大小显示额外的数据。有人知道在多个不同的屏幕大小上测试这个小部件的方法吗


我查看了源代码,但找不到任何内容。

您可以使用

以下代码将运行屏幕大小为42x42的测试

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

void main() {
  testWidgets("foo", (tester) async {
    tester.binding.window.physicalSizeTestValue = Size(42, 42);

    // resets the screen to its orinal size after the test end
    addTearDown(tester.binding.window.clearPhysicalSizeTestValue);

    // TODO: do something
  });
}

尽管@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),
    );

    ...
  });
}

不知道为什么,@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.
  });
}

@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
有一个名为的软件包可以模拟在不同设备上运行的颤振应用程序


您可以尝试此小部件来测试小部件实时更改屏幕大小

屏幕大小测试

预览

演示

代码示例

import'package:screen_size_test/screen_size_test.dart';
...
材料聚丙烯(
标题:“演示”,
生成器:(上下文,子项)=>ScreenSizeTest(
孩子:孩子,
),
家:脚手架(
正文:ListView(
子项:List.generate(
20,
(索引)=>容器(
填充:边缘设置。全部(10),
子:占位符(),
)),
),
),
)

通过测试,你指的是单元测试/类似测试还是手动测试?通过测试,我指的是小部件测试,就像在测试特定小部件是否可见时一样,类似于单元测试。那不完全是真的。它并没有真正改变大小,而是模拟MediaQuery。像
LayoutBuilder
RenderObjects
或golden tests之类的东西仍将基于默认大小。啊,好的,当我尝试使用TestWidgetsFlutterBinding时,它没有任何影响,因为在我的小部件中,我从MaterialApp小部件创建的MediaQuery获取屏幕大小。如果我删除MaterialApp小部件,它会抛出一个关于textDirection为null的错误,因此这似乎是最好的选项,但显然不是所有情况下的最佳选项。我建议将我的答案标记为解决方案(除非您不同意),由于模拟MediaQuery很少需要解决方案。如果一个具有Scaffold父项的小部件正在测试中,则需要添加Material app作为包装,如下所示:Wait tester.pumpWidget(new MaterialApp(home:new LoginScreen());默认尺寸是多少?我做了1200,2400,它仍然比默认的尺寸小。它的宽度是800,高度是600@RémiRousselet我听从了你的建议,但它对我来说不起作用texts@RémiRousselet签出并感谢,这一个对我有效(setSurfaceSize没有)。同样,setSurfaceSize()对我无效,但您的解决方案对我有效。谢谢。@VizGhar我听从了你的建议,但我无法正确处理文本签出,添加
devicePixelRatioTestValue
效果很好!它工作得很好。谢谢你,Slider不是wokring