我有一个Flutter小部件,根据屏幕大小显示额外的数据。 有人知道在多个不同的屏幕大小上测试此小部件的方法吗?
我已经查看了widget_tester源代码,但没有找到任何信息。
我有一个Flutter小部件,根据屏幕大小显示额外的数据。 有人知道在多个不同的屏幕大小上测试此小部件的方法吗?
我已经查看了widget_tester源代码,但没有找到任何信息。
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 original size after the test end
addTearDown(tester.binding.window.clearPhysicalSizeTestValue);
// TODO: do something
});
}
devicePixelRatioTestValue
属性设置像素密度。 - Bertester.binding.setSurfaceSize(size);
(请参见https://github.com/flutter/flutter/issues/12994#issuecomment-902964066)。 - Dominik Roszkowski我不确定为什么,但是@rémi-rousselet的解决方案对我没有起作用。我必须使用binding.window.physicalSizeTestValue
和binding.window.devicePixelRatioTestValue
指定屏幕尺寸,以便输出是完全确定的。
我为像我这样的Flutter初学者添加了更多代码。请查看以下内容:
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.
});
}
devicePixelRatioTestValue
很好用! - Moses Apricoas TestWidgetsFlutterBinding
。因此,整个代码如下:final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized() as TestWidgetsFlutterBinding;
- Loren.A@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
目前最安全的方法是使用setSurfaceSize。
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets("foo", (tester) async {
tester.binding.setSurfaceSize(Size(400, 400));
// reset
tester.binding.setSurfaceSize(null);
// continue
});
}
相关的 Github 问题请参见此处
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets("foo", (tester) async {
tester.view.physicalSize = Size(42, 42);
// resets the screen to its original size after the test end
addTearDown(tester.view.resetPhysicalSize);
// TODO: do something
});
}
tester.view.devicePixelRatio = 1.0;
。 - Hrishikesh Kadam你可以尝试使用这个小部件来测试你的小部件在实时更改屏幕大小时的效果。
屏幕大小测试
https://pub.dev/packages/screen_size_test
预览
演示 https://dartpad.dartlang.org/43d9c47a8bf031ce3ef2f6314c9dbd52
代码示例
import 'package:screen_size_test/screen_size_test.dart';
...
MaterialApp(
title: 'Demo',
builder: (context, child) => ScreenSizeTest(
child: child,
),
home: Scaffold(
body: ListView(
children: List.generate(
20,
(index) => Container(
padding: EdgeInsets.all(10),
child: Placeholder(),
)),
),
),
)
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),
);
...
});
}
LayoutBuilder
或RenderObjects
,或者golden tests仍然基于默认大小。 - Rémi Rousseletconst List<Size> _testedSizes = [
Size(800, 600),
Size(600, 800),
];
void testWidgetInPlatformMatrix(
String description,
Future<void> Function(WidgetTester) callback,
) {
for (var size in _testedSizes) {
testWidgets(
'$description ($size)',
(widgetTester) async {
await widgetTester.binding.setSurfaceSize(size);
return callback(widgetTester);
},
variant: TargetPlatformVariant.mobile(),
);
}
}
testWidgetInPlatformMatrix
而不是testWidgets
。testWidgetInPlatformMatrix('Counter increments smoke test',
(WidgetTester tester) async {
//...
});