1

我正在使用 flutter_bloc 库并尝试进行单元测试。我正在按照本教程中的说明进行此操作,并且效果很好。

但是,如果扩展 Equatable(需要)的 BlocState 具有许多扩展 Equatable 的属性或大型项目列表,以及它们的 props[] 定义为需要。

这使得expectLater()匹配正确的发射状态变得困难,因为它试图将确切的实例与其内容匹配,而不仅仅是状态类型或实例。

例如:

考虑以下状态类:

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 个项目,如何对其进行测试?

有没有办法只验证没有内容的实例类型?

4

2 回答 2

4

我不确定这是否是您的意思,但您可以执行以下操作:

List<String> myData = ['Mark', 'Mike', 'John', 'AddAsManyAsYouLike'];
bloc.add(SomeEvent());

expectLater(
    bloc,
    emitsInOrder([BlocState(data: myData)])
)

或者,如果您只关心可以使用的正确类型isA<>()

expectLater(
    bloc,
    emitsInOrder([isA<BlocState>()])
)
于 2020-06-09T12:35:00.647 回答
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'
        )
    ])
)
于 2021-03-31T12:39:19.010 回答