![](/img/trans.png)
[英]Dart / Flutter test cubit, problem with comparing expected and actual
[英]Flutter: bloc test problem with comparing expected and actual
我有如下測試:
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.
repositoriesDummyEntityFromRemote
是List<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);
}
}
老家
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];
}
家庭集團
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));
}
}
任何人都知道如何修復我的集團,以便我可以使其可測試?
ViewData
和RepositoriesEntity
必須擴展 Equatable,覆蓋 == 和 hashCode,或者實現 Comparable。
如果不是,則無法比較這些狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.