即使某些属性不相同,测试 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 是否会产生 MyBlocsStateUninitialized
和 MyBlocStateInitialized
,但不会检查 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 状态也会通过的主要内容,如果未能解决你的问题,请参考以下文章