颤振:将预期和实际进行比较的块试验问题



我有这样的测试:

blocTest(
'emits [ViewData.loading and ViewData.loaded] when GetRepositories is added',
build: () {
when(
() => useCase.getRepositories(),
).thenAnswer((_) async => Right(repositoriesDummyEntityFromRemote));
return homeBloc;
},
act: (HomeBloc bloc) => bloc.add(GetRepositories()),
expect: () => [
HomeState(
statusRepositories: ViewData.loading(message: 'Loading'),
isShowTitle: false,
),
HomeState(
statusRepositories:
ViewData.loaded(data: repositoriesDummyEntityFromRemote),
isShowTitle: false,
),
],
);

当我运行得到错误:

package:bloc_test/src/bloc_test.dart 229:13  testBloc.<fn>.<fn>
dart:async                                   _completeOnAsyncError
package:bloc_test/src/bloc_test.dart         testBloc.<fn>.<fn>
===== asynchronous gap ===========================
dart:async                                   _asyncThenWrapperHelper
package:bloc_test/src/bloc_test.dart         testBloc.<fn>.<fn>
dart:async                                   runZonedGuarded
package:bloc_test/src/bloc_test.dart 192:13  testBloc.<fn>
package:bloc_test/src/bloc_test.dart 191:5   testBloc.<fn>
dart:async                                   runZoned
package:bloc/src/bloc_overrides.dart 46:26   BlocOverrides.runZoned
package:bloc_test/src/bloc_test.dart 190:23  testBloc
package:bloc_test/src/bloc_test.dart 156:13  blocTest.<fn>
package:bloc_test/src/bloc_test.dart 155:5   blocTest.<fn>
Expected: [
HomeState:HomeState(Instance of 'ViewData<List<RepositoriesEntity>>', false),
HomeState:HomeState(Instance of 'ViewData<List<RepositoriesEntity>>', false)
]
Actual: [
HomeState:HomeState(Instance of 'ViewData<List<RepositoriesEntity>>', false),
HomeState:HomeState(Instance of 'ViewData<List<RepositoriesEntity>>', false)
]
Which: at location [0] is HomeState:<HomeState(Instance of 'ViewData<List<RepositoriesEntity>>', false)> instead of HomeState:<HomeState(Instance of 'ViewData<List<RepositoriesEntity>>', false)>
WARNING: Please ensure state instances extend Equatable, override == and hashCode, or implement Comparable.
Alternatively, consider using Matchers in the expect of the blocTest rather than concrete state instances.

repositoriesDummyEntityFromRemoteList<RepositoriesEntity>

请帮我解决我的测试。下面是我的Bloc, State和ViewData。

显示数据

class ViewData<T> {
ViewState status;
T? data;
String message = "";
Failure? failure;
ViewData._({
required this.status,
this.data,
this.message = "",
this.failure,
});
factory ViewData.loaded({T? data}) {
return ViewData._(status: ViewState.loaded, data: data);
}
factory ViewData.error({required Failure? failure}) {
return ViewData._(status: ViewState.error, failure: failure);
}
factory ViewData.loading({required String message}) {
return ViewData._(status: ViewState.loading, message: message);
}
factory ViewData.initial() {
return ViewData._(status: ViewState.initial);
}
factory ViewData.empty({required String message}) {
return ViewData._(status: ViewState.empty, message: message);
}
}

HomeState

class HomeState extends Equatable {
final ViewData<List<RepositoriesEntity>> statusRepositories;
final bool isShowTitle;
const HomeState({
required this.statusRepositories,
required this.isShowTitle,
});
HomeState copyWith({
ViewData<List<RepositoriesEntity>>? statusRepositories,
bool? isShowTitle,
}) {
return HomeState(
statusRepositories: statusRepositories ?? this.statusRepositories,
isShowTitle: isShowTitle ?? this.isShowTitle,
);
}
@override
List<Object?> get props => [statusRepositories, isShowTitle];
}

HomeBloc

class HomeBloc extends Bloc<HomeEvent, HomeState> {
final GTHomeUseCase homeUseCase;
HomeBloc({
required this.homeUseCase,
}) : super(HomeState(
statusRepositories: ViewData.initial(),
isShowTitle: false,
)) {
on<GetRepositories>(_getRepositories);
}
Future<void> _getRepositories(
GetRepositories event,
Emitter<HomeState> emit,
) async {
emit(state.copyWith(
statusRepositories: ViewData.loading(message: 'Loading')));
final response = await homeUseCase.getRepositories();
return response.fold(
(Failure failure) => _onFailureRepositories(emit, failure),
(List<RepositoriesEntity> data) => _onSuccessRepositories(emit, data),
);
}
Future<void> _onFailureRepositories(
Emitter<HomeState> emit,
Failure failure,
) async {
emit(state.copyWith(statusRepositories: ViewData.error(failure: failure)));
}
Future<void> _onSuccessRepositories(
Emitter<HomeState> emit,
List<RepositoriesEntity> data,
) async {
emit(state.copyWith(statusRepositories: ViewData.loaded(data: data)));
await Future.delayed(const Duration(milliseconds: 500));
emit(state.copyWith(isShowTitle: true));
}
}

谁知道如何修理我的集团,所以我可以让它可测试的吗?

ViewDataRepositoriesEntity必须扩展Equatable,覆盖==和hashCode,或者实现Comparable

如果它们不是,那么就没有办法比较状态。

最新更新