如何在颤动小部件测试中测试鼠标滚动事件?

时间:2020-10-17 18:59:28

标签: flutter flutter-test

我已经将PageView小部件包装在Listener小部件内。我在那里检查onPointerSignal属性是否pointerSignalPointerScrollEvent,以检测用户是否使用鼠标滚轮在小部件上滚动。然后,它不会产生怪异的行为,而是会产生I animateToPage,并将PageView的physics属性设置为NeverScrollableScrollPhysics(),以免干扰animateToPage的过渡。

那真的很酷!通过移动鼠标滚轮,它可以以平滑的动画从一页跳到另一页。

但是,通过小部件测试来测试行为时会很有趣。有人知道如何发出/发送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);
    },
  );
}

1 个答案:

答案 0 :(得分:0)

最后,我找到了一种方法。颤动测试启发了我: 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);
    },
  );
}