使用 BehaviorSubject 的测试中的 TimeoutException - BLoC

Posted

技术标签:

【中文标题】使用 BehaviorSubject 的测试中的 TimeoutException - BLoC【英文标题】:TimeoutException in test using BehaviorSubject - BLoC 【发布时间】:2019-07-17 05:07:34 【问题描述】:

我创建了一个使用 BehaviorSubject 的简单 Bloc,并且我正在尝试测试其发出的值,但是在测试期间我不断收到 TimeoutException,或者当我交换添加的流时会出现错误。

集团

class ApplicationBloc extends BlocBase

  final _appTitle = BehaviorSubject<String>();
  Function(String)  get changeTitle => (title) => _appTitle.sink.add(title);
  Stream<String> get apptitle => _appTitle.stream;

  ApplicationBloc()
   // _appTitle.sink.add('title');
  
  @override
  void dispose() 
    _appTitle.close();
  
   

测试

 test('check title correct', ()

        //works
       /* appBloc.changeTitle('hi');
        expect(appBloc.apptitle, emitsInAnyOrder(['hi']));*/

        //doesn't work
        appBloc.changeTitle('hi');
        appBloc.changeTitle('hello');
        expect(appBloc.apptitle, emitsInOrder(['hi', 'hello']));
  );  

当标题流发出单个项目时,它可以正常工作。但是当它发出多个项目时,它会超时。 这是我在交换发射顺序时得到的错误

错误:预期:应按顺序执行以下操作: * 发出一个“嗨”的事件 *发出一个'hello'事件实际:'>哪个:发出*你好 它没有发出“嗨”的事件,因为它发出了一个不同的事件。 预期:嗨 实际:你好 ^ 在偏移量 1 处不同

注意:当我将 BehaviorSubject 更改为 StreamController 时,一切正常

【问题讨论】:

【参考方案1】:

超时部分可能是一个错误,因为今天使用 RxDart 0.24.1,没有超时了。

但测试仍然没有通过,因为BehaviorSubject 仅在expect 订阅.apptitle 以侦听值时返回最新值。

要让主题返回它所提供的所有内容,请使用ReplaySubject

【讨论】:

以上是关于使用 BehaviorSubject 的测试中的 TimeoutException - BLoC的主要内容,如果未能解决你的问题,请参考以下文章

找不到模块 'rxjs/subject/BehaviorSubject'

期待一个间谍,但得到了 BehaviorSubject

Angular 中的 Subject vs BehaviorSubject vs ReplaySubject

我应该在 BehaviorSubject 中使用 asObservable 吗? [关闭]

将数组中的值附加到 BehaviorSubject

Angular2 中的 BehaviorSubject 不是第二次设置值?