簡體   English   中英

Flutter:如何模擬 Bloc

[英]Flutter: how to mock 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();

  @override
  void initState() {
    _filterController.addListener(() {
    widget._searchBloc.dispatch(FetchByName(_filterController.text));
     }
  }


 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);
  });
}

如您所見,我只是想測試一下,當用戶在搜索中寫入內容並且他正在尋找的對象存在時,應該顯示一張卡片。

如果我理解正確,您是在嘲笑 searchBloc 使用的某些服務。 我個人嘗試以一種應用程序僅依賴於一個集團而該集團可能依賴於其他一些服務的方式來設計該應用程序。 然后當我想做一個小部件測試時,我只需要模擬 bloc。 您可以為此使用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));

希望這可以幫助。

看一看David Anaya的帖子,該帖子涉及使用“Bloc”和 mockito 進行單元測試。

他的例子的最后一個版本在這里

有時小部件需要一點時間來構建。 嘗試:

await tester.pumpWidget(generateApp(_searchView));
await tester.enterText(find.byKey(Key("searchBar")), "a");
await tester.pump(Duration(seconds: 1));

expect(find.byType(Card), findsOneWidget);

要模擬 bloc,您可以使用bloc_test 包

此外,您可以觀看本教程,其中涵蓋了 bloc 測試,包括模擬 bloc 非常好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM