【问题标题】:Flutter: Provider error when mocking stream within a MockFlutter:在 Mock 中模拟流时提供程序错误
【发布时间】:2020-01-01 14:15:25
【问题描述】:

我有一个包含流的块对象:

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);

然后我构建一个测试小部件,通过provider 包提供这个块:

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

但是当我执行测试时,这个提供者构造失败并出现错误:

在构建 Provider(dirty, 状态: _DelegateWidgetState#9ee17): 尝试使用带有 Listenable/Stream (Bloc) 子类型的 Provider。

这可能是一个错误,因为 Provider 不会自动更新 Bloc 更新时的依赖项。相反,请考虑更改 Provider 对于处理更新机制的更具体的实现, 如:

  • ListenableProvider
  • ChangeNotifierProvider
  • ValueListenableProvider
  • 流提供者

应用运行正常,但测试失败,有什么帮助吗?

【问题讨论】:

  • 您提供的 BLoC 实现不是真实的,您提供的代码中没有任何内容会导致问题
  • @RémiRousselet 为什么你说 bloc 实现不是真正的?
  • 相关。异常表明您的 BLoC 类是流/可侦听的,但您的代码 sn-p 另有说明
  • 这很重要。因为当您的 sn-p 另有说明时,异常表明您的 Bloc 类是流/可监听的

标签: flutter flutter-provider


【解决方案1】:

这里的问题是由您尝试在MultiProvider.providers 上使用的提供程序引起的。如日志中所述,您可能需要考虑将 Provider 更改为更具体的实现。

考虑将提供程序修改为 ListenableProvider 并查看它是否适合您的用例。

MultiProvider(
  providers: [
    ListenableProvider<Bloc>.value(value: bloc)
  ],
  ...
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-07
    • 2021-12-15
    • 1970-01-01
    • 2021-09-30
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    相关资源
    最近更新 更多