我有一个小部件,它使用 bloc 构建器来映射小部件的不同状态。
class BodyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<NewsBloc, NewsState>(builder: (context, state) {
return state.map(
.....
);
});
}
....
}
BodyWidget
是在带有 BlocProvider 的 Widget 中创建的。
class MainPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) =>
getIt<NewsBloc>()..add(const NewsEvent.fetchNewsData()),
child: BodyWidget(),
);
}
....
}
NewsBloc 被定义为
@injectable
class NewsBloc extends Bloc<NewsEvent, NewsState> {
final GetNews getNews;
NewsBloc({
@required this.getNews,
}) : super(const _Initial());
@override
Stream<NewsState> mapEventToState(
NewsEvent event,
) async* { ... }
}
我正在使用get_it和injectionable 进行依赖注入。
现在我正在尝试编写一个简单的小部件测试BodyWidget
,但我不太确定如何在测试中注入所有这些依赖项。
class MockBuildContext extends Mock implements BuildContext {}
class MockNewsBloc extends Mock implements NewsBloc {}
void main() {
ForYouNewsTab _widget;
MockBuildContext _context;
NewsBloc _newsBloc;
Widget makeTestableWidgets({Widget child}) {
return MaterialApp(
home: Scaffold(
// body: BlocProvider(
// create: (_context) => getIt<NewsBloc>(),
// child: child,
// ),
body: child,
),
);
}
setUp(() {
_context = MockBuildContext();
_widget = ForYouNewsTab();
});
test('ForYouNewsTab is sub class of StatelessWidget', () {
expect(_widget, isA<StatelessWidget>());
});
testWidgets('should return sized box for initial state',
(WidgetTester tester) async {
await tester.pumpWidget(makeTestableWidgets(child: _widget));
});
}
我确实在 stackoverflow 中进行了搜索,但找不到适合我的解决方案。