Flutter: ошибка поставщика при имитации потока в Mock

У меня есть объект блока, который содержит поток:

Bloc {
  final _controller = StreamController<MainEvents>.broadcast();

  Stream<MainEvents> get stream => _controller.stream;
}

Я пытаюсь смоделировать этот объект, чтобы выполнить еще один тест с использованием Mockito:

Bloc bloc = Bloc();

final _controller = StreamController<MainEvents>.broadcast();
when(mainBloc.stream).thenAnswer((_) => _controller.stream);

Затем я создаю тестовый виджет, предоставляющий этот блок через пакет провайдера:

testWidget = MultiProvider(
  providers: [
    Provider<Bloc>.value(value: bloc)
  ],
  child: Something(),
);

Но когда я выполняю тест, конструкция этого провайдера завершается с ошибкой:

Следующее утверждение было брошено сборкой Provider(dirty, state: _DelegateWidgetState#9ee17): пытался использовать Provider с подтипом Listenable/Stream (Bloc).

Вероятно, это ошибка, так как поставщик обновляет блоки автоматически при обновлении блока. Вместо этого рассмотрите возможность изменения Provider для более конкретной реализации, которая обрабатывает механизм обновления, такой как:

  • ListenableProvider
  • ChangeNotifierProvider
  • ValueListenableProvider
  • StreamProvider

Приложение работает нормально, но тест не проходит, какая-нибудь помощь?

1 ответ

Проблема здесь была вызвана провайдером, который вы пытаетесь использовать на MultiProvider.providers. Как указано в журналах, вам может потребоваться рассмотреть возможность изменения поставщика на более конкретную реализацию.

Рассмотрите возможность изменения провайдера на ListenableProviderи посмотрите, подходит ли он для вашего варианта использования.

      MultiProvider(
  providers: [
    ListenableProvider<Bloc>.value(value: bloc)
  ],
  ...
)
Другие вопросы по тегам