Тестовый виджет с использованием шаблона BLoC - PullRequest
0 голосов
/ 27 ноября 2018

Я изучал флаттер / дартс и паттерн BLoC.Я использовал эту статью в качестве отправной точки: https://www.didierboelens.com/2018/08/reactive-programming---streams---bloc/

У меня есть класс блока и виджет, но я не могу понять, как проверить виджет.Я использую BlocProvider, как описано в статье, но я не могу понять, как предоставить виджету с классом блочного блока.

Если у меня есть такой код:

@override
Widget build(BuildContext context) {
  final ProfileBloc profileBloc = BlocProvider.of<ProfileBloc>(context);

  return Scaffold(
      body: Container(
        child: StreamBuilder<AuthModel>(
          stream: profileBloc.outAuthModel,
          initialData: null,
          builder: (BuildContext context, AsyncSnapshot<AuthModel> snapshot) {
            if (snapshot.hasData) {
              return buildProfilePage(context, snapshot.data.profile);
            }
            return buildStartPage();
          },
        ),
      ));
}

Я хочу издеваться над своим ProfileBloc, но он создается в моей функции build () и требует контекста.Как я могу проверить этот виджет?Я думаю, что мне нужен способ, чтобы перейти в поддельные ProfileBloc, но я не могу понять, как это сделать.Я хочу убедиться, что виджет ведет себя так, как задумано.

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

У меня была точно такая же проблема при тестировании виджета, и я смог ее решить.Вот «До кода», который не работал, и «После кода», который сделал трюк ...

ПЕРЕД КОДОМ

Обратите внимание, что при накачке виджета MaterialApp устанавливается как самый верхнийвиджет.

Future<Null> _buildRideCard(WidgetTester tester) async {
      await tester.pumpWidget(MaterialApp( // top most widget 
        localizationsDelegates: [
          AppLocalizationsDelegate(),
          GlobalMaterialLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate
        ],
        //some other stuff, irrelevant for this example
        
      ));
    }

ПОСЛЕ КОДА

Обратите внимание, что виджет MaterialApp теперь обернут BlocProvider, а его свойству blocProviders предоставлен список блоков, необходимых тесту виджета.Это решило мою проблему, и теперь у меня нет проблем с контекстом в блоке в моем тесте виджетов.Надеюсь, это поможет;)

Future<Null> _buildRideCard(WidgetTester tester) async {
      await tester.pumpWidget(BlocProviderTree( // <- magic #1
        blocProviders: [ <- magic #2
          BlocProvider<RideDetailsBloc>(
              bloc: RideDetailsBloc(_setupRidesRepo()))
        ],
        child: MaterialApp(
          localizationsDelegates: [
            AppLocalizationsDelegate(),
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate
          ],
          //some other stuff, irrelevant for this example
        ),
      ));
    }
0 голосов
/ 27 ноября 2018

В этом примере вы используете BlocProvider, чтобы получить ProfileBloc, но вы можете напрямую создать новый блок, используя final ProfileBloc profileBloc = ProfileBloc;.Использование внешнего блока не должно быть важным, потому что это после проверки виджета.

...