如何在 flutter widget 测试中测试鼠标滚动事件?
How to test mouse scroll event on flutter widget tests?
我已经将 PageView
小部件封装在 Listener
小部件中。如果 pointerSignal
是 PointerScrollEvent
,我检查 onPointerSignal
属性 以检测用户是否使用鼠标滚轮在小部件上滚动。然后,我 animateToPage
并没有执行它产生的奇怪行为,而是将 PageView 的 physics
属性 设置为 NeverScrollableScrollPhysics()
,因此它不会干扰 animateToPage
转换。
这真是太棒了!它通过移动鼠标滚轮以流畅的动画从一页跳到另一页。
但是通过小部件测试来测试行为时会很有趣。有人知道如何 emit/dispatch a PointerScrollEvent
吗?我尝试了以下但没有成功。
void main() {
testWidgets(
'when mouse wheel moved forward then next page is shown',
(WidgetTester tester) async {
await tester.pumpWidget(
Test(
child: PointerAwarePageView(
children: [
Text('1'),
Text('2'),
],
),
),
);
expect(find.text('1'), findsOneWidget);
tester.dispatchEvent(
PointerScrollEvent(scrollDelta: Offset(0.0, 1.0)),
HitTestResult(),
);
await tester.pump(Duration(seconds: 3));
expect(find.text('2'), findsOneWidget);
},
);
}
终于,我找到了办法。这个 flutter 测试启发了我:
https://github.com/flutter/flutter/blob/master/packages/flutter/test/widgets/scrollable_test.dart#L316
我们需要创建一个 TestPointer
鼠标设备类型并执行滚动。然后通过 WidgetTester
.
发送事件
我会在这里写下我的工作结果测试:
void main() {
testWidgets(
'when mouse wheel is scrolled then next page is shown',
(WidgetTester tester) async {
await tester.pumpWidget(
Test(
child: PointerAwarePageView(
children: [
Text('1'),
Text('2'),
],
),
),
);
expect(find.text('1'), findsOneWidget);
final Offset scrollEventLocation = tester.getCenter(find.byType(PointerAwarePageView));
final TestPointer testPointer = TestPointer(1, PointerDeviceKind.mouse);
testPointer.hover(scrollEventLocation);
final HitTestResult result = tester.hitTestOnBinding(scrollEventLocation);
await tester.sendEventToBinding(testPointer.scroll(const Offset(0.0, 1.0)), result);
await tester.pumpAndSettle();
expect(find.text('2'), findsOneWidget);
},
);
}
我已经将 PageView
小部件封装在 Listener
小部件中。如果 pointerSignal
是 PointerScrollEvent
,我检查 onPointerSignal
属性 以检测用户是否使用鼠标滚轮在小部件上滚动。然后,我 animateToPage
并没有执行它产生的奇怪行为,而是将 PageView 的 physics
属性 设置为 NeverScrollableScrollPhysics()
,因此它不会干扰 animateToPage
转换。
这真是太棒了!它通过移动鼠标滚轮以流畅的动画从一页跳到另一页。
但是通过小部件测试来测试行为时会很有趣。有人知道如何 emit/dispatch a PointerScrollEvent
吗?我尝试了以下但没有成功。
void main() {
testWidgets(
'when mouse wheel moved forward then next page is shown',
(WidgetTester tester) async {
await tester.pumpWidget(
Test(
child: PointerAwarePageView(
children: [
Text('1'),
Text('2'),
],
),
),
);
expect(find.text('1'), findsOneWidget);
tester.dispatchEvent(
PointerScrollEvent(scrollDelta: Offset(0.0, 1.0)),
HitTestResult(),
);
await tester.pump(Duration(seconds: 3));
expect(find.text('2'), findsOneWidget);
},
);
}
终于,我找到了办法。这个 flutter 测试启发了我: https://github.com/flutter/flutter/blob/master/packages/flutter/test/widgets/scrollable_test.dart#L316
我们需要创建一个 TestPointer
鼠标设备类型并执行滚动。然后通过 WidgetTester
.
我会在这里写下我的工作结果测试:
void main() {
testWidgets(
'when mouse wheel is scrolled then next page is shown',
(WidgetTester tester) async {
await tester.pumpWidget(
Test(
child: PointerAwarePageView(
children: [
Text('1'),
Text('2'),
],
),
),
);
expect(find.text('1'), findsOneWidget);
final Offset scrollEventLocation = tester.getCenter(find.byType(PointerAwarePageView));
final TestPointer testPointer = TestPointer(1, PointerDeviceKind.mouse);
testPointer.hover(scrollEventLocation);
final HitTestResult result = tester.hitTestOnBinding(scrollEventLocation);
await tester.sendEventToBinding(testPointer.scroll(const Offset(0.0, 1.0)), result);
await tester.pumpAndSettle();
expect(find.text('2'), findsOneWidget);
},
);
}