我正在尝试测试包含StreamBuilder的小部件,但无法返回数据。
小部件:
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
但它总是返回snapshot.hasData == false
有两个问题-首先,您正在模拟Stream,但没有在其上放置任何数据,因此StreamBuilder假定Stream为空。其次,一旦将数据放到Stream上,就需要再次抽出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,返回Stream.value(List []),检查正确的Widget等)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句