虎視眈々と

Flutter × Firebaseを研究するアプリエンジニア

FlutterでBLoCのテストを書く

FlutterでBLoCのテストを書く方法について

BLoCって何?って方は下記の記事をご参照ください。

www.shogogeek.com

BLoCクラス

まずはBlocクラス

class HomeBloc {
  final UserRepositoryInterface userRepository;

  HomeBloc({
    @required this.userRepository,
  }) {
    _getUserInfo();
  }

  StreamController<User> _userController = StreamController<User>();

  StreamSink<User> get _userSink => _userController.sink;

  Stream<User> get userStream => _userController.stream;

  void dispose() {
    _userController.close();
  }

  _getUserInfo() async {
    _userSink.add(await userRepository.getUser());
  }
}

このクラスからRepositoryを設定されているとき userRepository からデータが返ってきた時に userStream にデータがaddされるかテストするコードを書きます。

テストを書く

今回はRepositoryをモック化しています。

void main() {
  UserRepositoryInterface repository;

  setUp(() {
    repository = FakeUserRepository();
  });

  HomeBloc createBloc() {
    return HomeBloc(
        userRepository: repository);
  }

  test("user stream test", () async {
    User user = await repository.getUser();
    HomeBloc bloc = createBloc();

    bloc.userStream.listen((User result) {
      expect(result.uid, user.uid);
    });
  });

bloc.userStream にデータがくるのを listen してデータがきたら結果が正しいかチェックしています。