如何使用 Mockito 在 Flutter 中测试 StreamBuilder?

How do you test StreamBuilder in Flutter using Mockito?

我正在尝试测试一个包含 StreamBuilder 的小部件,但我无法 return 数据。

小部件:

class HomeView extends StatelessWidget {
  final EventServiceRepository eventService;

  HomeView({this.eventService});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder<List<Event>>(
         stream: this.eventService.getEvents(dates: dates),
         builder: (context, snapshot) {
           if (!snapshot.hasData) return HomeLoading();
           return EventsView(events: snapshot.data);
         },
       )
    );
  }
}

测试:

class MockedEventService extends Mock implements EventServiceRepository {}
class MockedEventStream extends Mock implements Stream<List<Event>> {}

testWidgets('Should find EventsView', (WidgetTester tester) async {
    final mockedEventService = MockedEventService();
    final mockedEventStream = MockedEventStream();
    when(mockedEventService.getEvents(dates: ['1/1/2021']))
        .thenAnswer((_) => mockedEventStream);

    when(mockedEventStream); // return list of events?

    await tester.pumpWidget(HomeView(eventService: mockedEventService));

    expect(find.byType(EventsView), findsOneWidget);
});

我用 mockedEventStream 尝试了一些东西,但总是 returns snapshot.hasData == false

两个问题 - 首先,您在模拟 Stream,但没有在其上放置任何数据,因此 StreamBuilder 假定 Stream 为空。其次,一旦将数据放到 Stream 上,就需要再次 pump Widget 以刷新 StreamBuilder。我个人也不会费心去嘲笑 Stream 本身。

我的小改版:

final mockedEventService = MockedEventService();
when(mockedEventService.getEvents()).thenAnswer((_) => Stream.value(true));
await tester.pumpWidget(MyHomePage(eventService: mockedEventService)); 
await tester.pump(Duration.zero); 
expect(find.byKey(ObjectKey("B")), findsOneWidget);

显然需要更改以反映您的原始代码(模拟 EventServiceRepository,return a Stream.value(List[]),检查正确的 Widget,等等)。