testing - 即使某些属性不相同,测试 bloc 状态也会通过
问题描述
这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
and MyBlocStateInitialized
,但不会检查里面的字符串MyBlocStateInitialized
。其实我也可以换
expectLater(
_myBloc.state,emitsInOrder([
MyBlocsStateUninitialized(),
MyBlocInitialized('WRONG')
]));
_myBloc.dispatch(MyBlocEventInitialize(_somethingString);
}
它仍然会过去。
解决方案
每次您的状态有一个可比较的参数时,您都必须将它传递给父构造函数 -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;
}
推荐阅读
- c# - 如何在 WPF Net5 应用程序中创建单个文件?
- css - 如何在 React 中设置与主页的正文图像不同的样式?
- oracle - 在带有 Oracle 18c 的 Windows 10 上无法读取外部表或使用 utl_file.get_line 读取
- python - 在管理表单中为自定义字段加载模板
- sql - 查询sqlalchemy.Table中指定id后的用户列表
- javascript - 替代已弃用的 e.which,以防止输入非数字字符?
- git - 远程参考更改
- node.js - 开发和生产港口
- google-bigquery - 如何在 BigQuery 中使用连接修剪分区?
- python - 类型错误:press() 缺少 1 个必需的位置参数:“按钮”