如何使用 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,等等)。
我正在尝试测试一个包含 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,等等)。