即使某些属性不相同,测试 bloc 状态也会通过

Posted

技术标签:

【中文标题】即使某些属性不相同,测试 bloc 状态也会通过【英文标题】:Testing the bloc state will pass even if some properties are not the same 【发布时间】:2020-01-06 09:41:18 【问题描述】:

这是mapEventToState 中的MyBloc

@override
  Stream<MyBlocState> mapEventToState(MyBlocEvent event) async* 
    if (event is MyBlocInitialize) 
      yield MyBlocStateInitialized(event.something);
    

状态的定义如下:

abstract class MyBlocState extends Equatable 
  EnterCredentialsState([List props = const []]) : super(props)


class MyBlocStateInitialized extends MyBlocState 
  final String _something;
  MyBlocStateInitialized(this._something);

事件如下:

abstract class MyBlocEvent 

class MyBlocEventInizialize extends MyBlocEvent
  final string something;
  MyBlocEventInitialize(this.something);

现在,这是我的测试:

test('Should return MyBlocInitialized with a defined String', () 
    String _somethingString = 'Something';

expectLater(
_myBloc.state,emitsInOrder([
          MyBlocsStateUninitialized(),
          MyBlocStateInitialized(_somethingString)
        ]));

    _myBloc.dispatch(MyBlocEventInitialize(_somethingString);

这个测试的问题是它只会检查 bloc 是否会产生 MyBlocsStateUninitializedMyBlocStateInitialized,但不会检查 MyBlocStateInitialized 中的字符串。其实我也可以换

expectLater(
_myBloc.state,emitsInOrder([
          MyBlocsStateUninitialized(),
          MyBlocInitialized('WRONG')
        ]));

    _myBloc.dispatch(MyBlocEventInitialize(_somethingString);

它仍然会通过。

【问题讨论】:

【参考方案1】:

每当你的状态有一个类似的参数时,你必须将它传递给父构造函数 - Equatable - 就像你对 MyBlocState 所做的那样,否则它将用一个空列表初始化,你会收到一个 false比较是肯定的。

来自平等的

构造函数采用props(属性)的可选[List],用于确定两个[Equatables] 是否相等。 如果没有提供任何属性,props 将被初始化为一个空的 [List]。

abstract class MyBlocState extends Equatable 
  EnterCredentialsState([List props = const []]) : super(props)


class MyBlocStateInitialized extends MyBlocState 
  MyBlocStateInitialized(this._something): super([_something]);
  final String _something;

【讨论】:

以上是关于即使某些属性不相同,测试 bloc 状态也会通过的主要内容,如果未能解决你的问题,请参考以下文章

Flutter BloC 布尔更新状态

即使处于非活动状态,Hangfire也会继续运行SQL查

Flutter BLoC 测试

即使我已显着移动,也会在后台更新相同的位置

Bloc:如何模拟获取状态

Flutter Bloc Test:空值检查运算符用于空值(空安全)