[Flutter] : TDD - 07. Network Info


Repository 구현이 끝이 났다.

나머지 DataLayer를 구현해야 하는데

Repository에서 제일 먼저 체크하는 부분이 NetworkInfo였다.

인터넷에 연결됬는지 안됬는지에 따라 Cache 데이터를 가져올지 말지 결정을 해야했다.

그래서 먼저 NetworkInfo부터 작성해보자.

참고로 외부 라이브러리를 가져와서 사용할 예정이다.

plugin 변경


처음 시작부분에 보면 connectivity 를 사용한다고 되어있다. 하지만 라이브러리 내부 설명을 읽어보니

Android에서는 보장하지 못하는 부분들이 있어서 data_connection_checker 로 수정하였다.

강의에서는 폴더 이름도 platform에서 network로 수정하는데 나는 귀찮아서 그냥 진행하도록 하겠다.

Test 코드 작성


class MockDataConnectionChecker extends Mock implements DataConnectionChecker {}

void main() {
  NetworkInfoImpl networkInfo;
  MockDataConnectionChecker mockDataConnectionChecker;

  setUp(() {
    mockDataConnectionChecker = MockDataConnectionChecker();
    networkInfo = NetworkInfo(mockDataConnectionChecker);
  });

  group('isConnected', () {
    test('should forward the call to DataConnectionChecker.hasConnection',
        () async {
      // arrange
      final tHasConnectionFuture = Future.value(true);
      when(mockDataConnectionChecker.hasConnection)
          .thenAnswer((_) => tHasConnectionFuture);
      // act
      final result = networkInfo.isConnected;
      // assert
      verify(mockDataConnectionChecker.hasConnection);
      expect(result, tHasConnectionFuture);
    });
  });
}

여기서 보면 사실 NetworkInfo.isConnectedDataConnectionChecker().hasConnection을 단순하게 불러온다. 이렇게 외부 라이브러리를 내가 만든 interface로 감싸주면 낭비처럼 보일 수 있어도

나중에 다른 라이브러리를 사용하던지 할 때 추가적인 코드 수정이 없어진다.

network_info.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;
}

자 이제 네트워크 TDD와 코드 구현은 끝이 났다.

다음으로는 로컬 디비 접근을 해보자.