Flutter:如何嘲笑Bloc

时间:2019-03-19 08:11:08

标签: testing flutter mocking bloc

我想模拟我的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);
  });
}

正如您所看到的,我只想测试一下,当用户在搜索中写东西时,并且他要查找的对象存在时,应该显示一张卡片。

4 个答案:

答案 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非常好。