首页 > 解决方案 > 即使某些属性不相同,测试 bloc 状态也会通过

问题描述

mapEventToStateMyBloc

@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 是否会产生MyBlocsStateUninitializedand MyBlocStateInitialized,但不会检查里面的字符串MyBlocStateInitialized。其实我也可以换

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

    _myBloc.dispatch(MyBlocEventInitialize(_somethingString);
}

它仍然会过去。

标签: testingflutterdartbloc

解决方案


每次您的状态有一个可比较的参数时,您都必须将它传递给父构造函数 -Equatable就像您对 所做的那样MyBlocState,否则它将使用一个空列表进行初始化,并且在比较时您将收到误报。

从平等

构造函数采用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;
}

推荐阅读