我有一个使用 bloc
的 Flutter 应用程序和 flutter_bloc
包裹。我正在尝试使用 flutter_driver
编写集成测试和 mockito
.我如何模拟 BlocProvider
和它的 child 总是发出一个单一的 mock 状态?
原来的 Bloc :
class SummaryBloc extends Bloc<BlocEvent, BlocState> {
final SummaryRepository repository;
SummaryBloc(this.repository);
@override
BlocState<Summary> get initialState => BlocStateEmpty<Summary>();
@override
Stream<BlocState> mapEventToState(
BlocEvent event,
) async* {
if (event is Fetch) yield BlocStateSuccess<Summary>(repository.getSummary());
}
}
我试过模拟 bloc 并覆盖 state
setter/getter :
class MockSummaryBloc extends Mock implements SummaryBloc {}
然后在检测应用中使用 mockito:
final MockSummaryBloc summaryBloc = MockSummaryBloc();
// whenever the state stream getter is called, return the mocked stream.
when(summaryBloc.state).thenAnswer((_) async* {
yield BlocStateSuccess<Summary>(mockSummary);
});
为了更好的衡量,我对 initialState
也做了同样的尝试.
要在检测应用程序中使用模拟,我使用 BlocProvider.value
:
runApp(BlocProvider.value(
value: summaryBloc,
child: MaterialApp(
title: 'Test Driver',
home: Scaffold(
body: BlocBuilder(
bloc: summaryBloc,
// the builder rebuilds on state change.
builder: (context, state) {
return Text('state: ${state?.runtimeType ?? 'isNull'}');
},
)),
),
));
我希望文本小部件打印 BlocStateSuccess<Summary>
在运行时。但是,在驱动程序测试的生命周期内状态为空。
我是不是在错误地 mock 这个 Bloc ?是否有其他模拟 Bloc 的方法,或 Stream<BlocState>
?
最佳答案
您应该尝试模拟 SummaryRepository
而不是 Bloc。这将允许您测试 bloc 的行为并控制存储库返回流的内容。
class MockSummaryRepository extends Mock implements SummaryRepository{}
var mockRepository = MockSummaryRepository();
when(mockRepository.getSummary()).thenReturn(mockSummary);
final SummaryBloc summaryBloc = SummaryBloc(mockRepository);
关于unit-testing - 如何在集成测试中模拟 BLoC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57273168/