簡體   English   中英

如何模擬“google_maps_flutter”包以進行顫振測試?

[英]How to mock 'google_maps_flutter' package for flutter tests?

我最近開始接觸 flutter,但就在我准備編寫一些小部件測試時,我注意到我不太確定如何模擬 Google Maps Flutter 包。

我見過的許多例子包括使用庫“mockito”來模擬類,但這假設谷歌地圖小部件將被注入到要測試的小部件中。 不幸的是,根據他們給定的文檔和啟動指南,這似乎不太可能:

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 使用的頻道來模擬它:

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 插件測試(它是一個類似於 GoogleMaps 小部件的 PlatformView)以及這個 GoogleMaps 插件測試中獲得了靈感

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM