如何在 flutter widget 测试中测试鼠标滚动事件?

How to test mouse scroll event on flutter widget tests?

我已经将 PageView 小部件封装在 Listener 小部件中。如果 pointerSignalPointerScrollEvent,我检查 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);
    },
  );
}