Flutter BLoC 测试
Flutter BLoC Testing
我正在使用 flutter_bloc 库并尝试进行单元测试。
我几乎按照 this tutorial 中的说明执行此操作,并且运行良好。
但是,如果一个扩展了 Equatable(这是必需的)的 BlocState 具有许多属性或扩展了 Equatable 的大量项目列表,以及根据需要定义了它们的 props[]。
这使得 expectLater()
很难匹配正确的发射状态,因为它试图匹配确切的实例及其内容,而不仅仅是状态类型或实例。
例如:
考虑以下状态 class:
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 个项目,如何测试它?
有没有办法只验证实例类型而不验证内容?
我不确定这是否是你的意思,但你可以这样做:
List<String> myData = ['Mark', 'Mike', 'John', 'AddAsManyAsYouLike'];
bloc.add(SomeEvent());
expectLater(
bloc,
emitsInOrder([BlocState(data: myData)])
)
或者,如果您只关心正确的类型,您可以使用 isA<>()
expectLater(
bloc,
emitsInOrder([isA<BlocState>()])
)
我来晚了一点,但我有同样的问题,我发现了这个:
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'
)
])
)
我正在使用 flutter_bloc 库并尝试进行单元测试。 我几乎按照 this tutorial 中的说明执行此操作,并且运行良好。
但是,如果一个扩展了 Equatable(这是必需的)的 BlocState 具有许多属性或扩展了 Equatable 的大量项目列表,以及根据需要定义了它们的 props[]。
这使得 expectLater()
很难匹配正确的发射状态,因为它试图匹配确切的实例及其内容,而不仅仅是状态类型或实例。
例如:
考虑以下状态 class:
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 个项目,如何测试它?
有没有办法只验证实例类型而不验证内容?
我不确定这是否是你的意思,但你可以这样做:
List<String> myData = ['Mark', 'Mike', 'John', 'AddAsManyAsYouLike'];
bloc.add(SomeEvent());
expectLater(
bloc,
emitsInOrder([BlocState(data: myData)])
)
或者,如果您只关心正确的类型,您可以使用 isA<>()
expectLater(
bloc,
emitsInOrder([isA<BlocState>()])
)
我来晚了一点,但我有同样的问题,我发现了这个:
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'
)
])
)