Flutter BLoC 测试
Posted
技术标签:
【中文标题】Flutter BLoC 测试【英文标题】:Flutter BLoC Testing 【发布时间】:2020-09-28 11:53:19 【问题描述】:我正在使用 flutter_bloc 库并尝试进行单元测试。 我正在按照this tutorial 中的说明进行此操作,并且做得很好。
但是,如果扩展 Equatable(需要)的 BlocState 具有许多扩展 Equatable 的属性或大量项目列表,以及它们的 props[] 定义为需要。
这使得expectLater()
很难匹配正确的发射状态,因为它试图将确切的实例与其内容匹配,而不仅仅是状态类型或实例。
例如:
考虑以下 State 类:
class BlocState extends Equatable
final List<String> data;
BlocState(this.data);
@override
List<Object> get props => [data];
然后对于像这样的发射状态:
List<String> data = ['Mark', 'Mike', 'John']
BlocState(data: data);
这个expectLater会失败
expectLater(
bloc,
emitsInOrder([BlocState(),]), //This will fail as the state does't equals exactly to the real state
)
这个会通过的:
expectLater(
bloc,
emitsInOrder([BlocState(data: ['Mark', 'Mike', 'John']),]), //This will pass
)
在这种简单的状态下,可以验证确切的内容,但如果列表将包含 100 个项目,如何对其进行测试?
有没有办法只验证没有内容的实例类型?
【问题讨论】:
【参考方案1】:我有点晚了,但我有同样的问题,我发现了这个:
List<String> myData = ['Mark', 'Mike', 'John', 'AddAsManyAsYouLike'];
bloc.add(SomeEvent());
expectLater(
bloc,
emitsInOrder([
predicate<BlocState>(
(state) =>
state.oneOfMyProperties == 'expected value' &&
state.anotherProperty == 'another expected value'
)
])
)
【讨论】:
【参考方案2】:我不确定这是否是您的意思,但您可以这样做:
List<String> myData = ['Mark', 'Mike', 'John', 'AddAsManyAsYouLike'];
bloc.add(SomeEvent());
expectLater(
bloc,
emitsInOrder([BlocState(data: myData)])
)
或者,如果您只关心正确的类型,您可以使用isA<>()
expectLater(
bloc,
emitsInOrder([isA<BlocState>()])
)
【讨论】:
谢谢@Er1!您的答案的第一部分适用于 did 中的简单内容,但如果它是 List以上是关于Flutter BLoC 测试的主要内容,如果未能解决你的问题,请参考以下文章