-
こちらのチュートリアルの解説をします。
-
チュートリアルを読むのが早いと思いますが、概要をまとめたのでこちらもご参照ください。
-
今回はNetworkInfoの実装をします
packageの変更
- Android端末でのWiFi接続の挙動が保証されないため、変更
package.yaml
dependencies:
# Swap the connectivity package for this
data_connection_checker: ^0.3.4
NetworkInfoの実装
Test
- resultとして Future型の値を取得して、検証している
- awaitせず、Future同士で比較している
- expectにてmatcherを使わず、同一インスタンスとして比較している
-
==
と同じ比較になっている
-
network_info_test.dart
import 'package:clean_architecture_tdd_prep/core/network/network_info.dart';
import 'package:data_connection_checker/data_connection_checker.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
class MockDataConnectionChecker extends Mock implements DataConnectionChecker {}
void main() {
NetworkInfoImpl networkInfo;
MockDataConnectionChecker mockDataConnectionChecker;
setUp(() {
mockDataConnectionChecker = MockDataConnectionChecker();
networkInfo = NetworkInfoImpl(mockDataConnectionChecker);
});
group('isConnected', () {
test(
'should forward the call to DataConnectionChecker.hasConnection',
() async {
// arrange
final tHasConnectionFuture = Future.value(true);
when(mockDataConnectionChecker.hasConnection)
.thenAnswer((_) => tHasConnectionFuture);
// act
// NOTICE: We're NOT awaiting the result
final result = networkInfo.isConnected;
// assert
verify(mockDataConnectionChecker.hasConnection);
// Utilizing Dart's default referential equality.
// Only references to the same object are equal.
expect(result, tHasConnectionFuture);
},
);
});
}
- 実装
network_info.dart
import 'package:data_connection_checker/data_connection_checker.dart';
abstract class NetworkInfo {
Future<bool> get isConnected;
}
class NetworkInfoImpl implements NetworkInfo {
final DataConnectionChecker connectionChecker;
NetworkInfoImpl(this.connectionChecker);
@override
Future<bool> get isConnected => connectionChecker.hasConnection;
}
学んだこと
サードパーティーライブラリを隠蔽化するクラスを作る
-
NetworkInfo().isConnected
はDataConnectionChecker().hasConnection
を読んでいるだけである- ライブラリの変更等があった場合、この小さいクラスの修正に留められる
- 単一責任の原則の実践であり、ソフトウェアの変更に強い設計となっている
- ライブラリの変更等があった場合、この小さいクラスの修正に留められる
テストでFutureをawaitせずともassertできる
- Future同士で比較できる