【问题标题】:How to mock 'google_maps_flutter' package for flutter tests?如何模拟“google_maps_flutter”包进行颤振测试?
【发布时间】:2019-06-13 22:21:00
【问题描述】:

我最近开始接触 Flutter,但就在我准备编写一些小部件测试时,我注意到我不太确定如何模拟 Google Maps Flutter 包。

我见过的许多示例包括使用“mockito”库来模拟类,但这假设 Google 地图小部件将被注入到要测试的小部件中。不幸的是,根据他们提供的文档和启动指南,这似乎不太可能:

class MapsDemo extends StatefulWidget {
  @override
  State createState() => MapsDemoState();
}

class MapsDemoState extends State<MapsDemo> {

  GoogleMapController mapController;

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.all(15.0),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: <Widget>[
          Center(
            child: SizedBox(
              width: 300.0,
              height: 200.0,
              child: GoogleMap(
                onMapCreated: _onMapCreated,
              ),
            ),
          ),
          RaisedButton(
            child: const Text('Go to London'),
            onPressed: mapController == null ? null : () {
              mapController.animateCamera(CameraUpdate.newCameraPosition(
                const CameraPosition(
                  bearing: 270.0,
                  target: LatLng(51.5160895, -0.1294527),
                  tilt: 30.0,
                  zoom: 17.0,
                ),
              ));
            },
          ),
        ],
      ),
    );
  }

  void _onMapCreated(GoogleMapController controller) {
    setState(() { mapController = controller; });
  }
}

请注意,GoogleMaps 小部件无法传入,因为 onMapCreated 是必需的函数,并且该函数依赖于私有类方法(授予父小部件对 GoogleMapsController 的访问权限)。没有这种回调函数来设置状态的 mockito 模拟函数的许多其他示例。

似乎没有任何其他包可以有效地模拟 GoogleMaps 小部件,所以我真的没有任何示例可以效仿。理想情况下,我期待的是某种行为,例如 node.s 中的 proxyquire 或 sinon(您不需要将模拟库传递给 function.constructors),但看起来模拟类需要传递到经过测试的小部件。

关于如何模拟这个库进行测试还有其他想法吗?还是我应该只测试实际功能?

【问题讨论】:

  • 你解决这个问题了吗?我在嘲笑 GoogleMaps 时遇到了同样的问题

标签: google-maps mocking flutter mockito flutter-test


【解决方案1】:

我设法通过模拟它使用的渠道来模拟 GoogleMaps:

setUpAll(() async {
  SystemChannels.platform_views.setMockMethodCallHandler((MethodCall call) {
    switch (call.method) {
      case 'create':
        return Future<int>.sync(() => 1);
      default:
        return Future<void>.sync(() {});
    }
  });

  MethodChannel('plugins.flutter.io/google_maps_0', StandardMethodCodec())
    .setMockMethodCallHandler((MethodCall methodCall) async {
      return null;
    });
}

我的灵感来自这个 webview 插件test(它是一个类似于 GoogleMaps 小部件的 PlatformView),以及这个 GoogleMaps 插件test

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 2021-05-21
    • 2021-09-25
    • 2022-08-11
    • 2021-10-25
    • 2019-08-19
    • 1970-01-01
    • 2019-08-05
    • 2021-08-11
    相关资源
    最近更新 更多