首页 > 解决方案 > 如何在 Flutter 中对连接包进行单元测试

问题描述

我正在使用连接包,假设我有以下代码:

_connectionSubscription = Connectivity().onConnectivityChanged.listen((
    ConnectivityResult result) {
  if (result == ConnectivityResult.mobile ||
      result == ConnectivityResult.wifi && !isDataLoading) {
    _loadData();
  }
});

我想模拟不同的状态,看看我的代码在不同情况下是如何工作的。

那么我们如何在 Flutter 中使用 package:flutter_test 环境对其进行测试呢?

标签: flutterdart

解决方案


您可以通过实现它来创建 Connectivity 类的模拟。然后在模拟类中,根据需要实现方法。

例子:


enum ConnectivityCase { CASE_ERROR, CASE_SUCCESS }

class MockConnectivity implements Connectivity {
  var connectivityCase = ConnectivityCase.CASE_SUCCESS;

  Stream<ConnectivityResult> _onConnectivityChanged;

  @override
  Future<ConnectivityResult> checkConnectivity() {
    if (connectivityCase == ConnectivityCase.CASE_SUCCESS) {
      return Future.value(ConnectivityResult.wifi);
    } else {
      throw Error();
    }
  }

  @override
  Stream<ConnectivityResult> get onConnectivityChanged {
    if (_onConnectivityChanged == null) {
      _onConnectivityChanged = Stream<ConnectivityResult>.fromFutures([
        Future.value(ConnectivityResult.wifi),
        Future.value(ConnectivityResult.none),
        Future.value(ConnectivityResult.mobile)
      ]).asyncMap((data) async {
        await Future.delayed(const Duration(seconds: 1));
        return data;
      });
    }
    return _onConnectivityChanged;
  }

  @override
  Future<String> getWifiBSSID() {
    return Future.value("");
  }

  @override
  Future<String> getWifiIP() {
    return Future.value("");
  }

  @override
  Future<String> getWifiName() {
    return Future.value("");
  }
}


推荐阅读