我想模拟我的Bloc以测试我的观点。
例如,这是我的集团:
class SearchBloc extends Bloc<SearchEvent, SearchState> {
@override
// TODO: implement initialState
SearchState get initialState => SearchStateUninitialized();
@override
Stream<SearchState> mapEventToState(SearchState currentState, SearchEvent event) async* {
if (event is UserWrites) {
yield (SearchStateInitialized.success(objects);
}
}
}
这是视图:
class _SearchViewState extends State<SearchView> {
final TextEditingController _filterController = new TextEditingController();
TextField buildAppBarTitle(BuildContext context) {
return new TextField(
key: Key("AppBarTextField"),
controller: _filterController,
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: buildAppBarTitle(context),),
body: buildBlocBuilder(),
);
}
BlocBuilder<SearchEvent, SearchState> buildBlocBuilder() {
return BlocBuilder(
bloc: widget._searchBloc,
builder: (context, state) {
if (state is SearchStateUninitialized) {
return Container(
key: Key("EmptyContainer"),
);
}
return buildInitializedView(state, context);
}
});
buildInitializedView(SearchStateInitialized state, BuildContext context) {
if (state.objects.isEmpty) {
return Center(child: Text("Nothing found"),);
} else {
return buildListOfCards();
}
}
}
现在,这是我的测试:
testWidgets('Should find a card when the user searches for something', (WidgetTester tester) async {
_searchView = new SearchView(_searchBloc);
when(mockService.find( name: "a")).thenAnswer((_) =>
[objects]);
await tester.pumpWidget(generateApp(_searchView));
await tester.enterText(find.byKey(Key("searchBar")), "a");
await tester.pump();
expect(find.byType(Card), findsOneWidget);
});
}
正如您所看到的,我只想测试一下,当用户在搜索中写东西时,并且他要查找的对象存在时,应该显示一张卡片。
答案 0 :(得分:2)
如果我理解正确,那么您正在嘲笑searchBloc使用的某些服务。我个人尝试以仅依赖于某个团体的方式设计该应用程序,而该团体可能依赖于某些其他服务。然后,当我想进行小部件测试时,我只需要模拟块。您可以为此使用bloc_test软件包。
在bloc_test页面上有一个示例,用于存入counterBloc:
// Create a mock instance
final counterBloc = MockCounterBloc();
// Stub the bloc `Stream`
whenListen(counterBloc, Stream.fromIterable([0, 1, 2, 3]));
但是,我经常不需要对bloc流进行存根,这样就足以发出状态了
when(counterBloc.state).thenAnswer((_) => CounterState(456));
希望这会有所帮助。
答案 1 :(得分:0)
看看David Anaya中的一篇帖子,该帖子涉及使用“ Bloc”和Mockito进行单元测试。
他的示例的最新版本是here
答案 2 :(得分:0)
有时小部件需要一些时间来构建。尝试:
await tester.pumpWidget(generateApp(_searchView));
await tester.enterText(find.byKey(Key("searchBar")), "a");
await tester.pump(Duration(seconds: 1));
expect(find.byType(Card), findsOneWidget);
答案 3 :(得分:0)
要模拟集团,您可以使用bloc_test package
此外,您可能会看到this tutorial涵盖了bloc测试,其中包括模拟bloc非常好。