У меня есть класс CustomTabBar
, который возвращает TabBarWidget. Итак, базовая структура виджета CustomTabBar
выглядит так:
class CustomTabBar extends StatelessWidget {
...
final bool isBottomIndicator;
...
@override
Widget build(BuildContext context) {
return TabBar(
.....
indicator: BoxDecoration(
border: isBottomIndicator
? Border(
bottom: BorderSide(
color: Theme.of(context).colorScheme.tabbarSelectorColor,
width: 3.0,
),
)
: Border(
top: BorderSide(
color: Theme.of(context).colorScheme.tabbarSelectorColor,
width: 3.0,
),
),
),
......
);
}
}
Положение индикатора контролируется переменной isBottomIndicator
.
Теперь я пытаюсь написать тестовый пример для этого виджета. До сих пор я пробовал этот тестовый пример:
testWidgets('CustomTabBar with bottom indicator',
(WidgetTester tester) async {
final _customTabBar = CustomTabBar(
tabs: _tabs,
selectedIndex: _selectedIndex,
onTap: (_) {},
isBottomIndicator: true,
);
await tester.pumpWidget(makeTestableWidgets(child: _customTabBar));
final tabBar = find.byType(TabBar).first as TabBar;
expect(
tabBar.indicator,
BoxDecoration(
border: Border(
bottom: BorderSide(
width: 3.0,
),
),
),
);
});
Исключение, которое я получаю от компилятора,
The following _CastError was thrown running a test:
type '_WidgetTypeFinder' is not a subtype of type 'TabBar' in type cast
Я не знаю, как мне разыграть виджет, который я нашел через find.byType()
Следующий тест проходит, где я проверяю, присутствует ли TabBar.
testWidgets('CustomTabBar has a TabBar', (WidgetTester tester) async {
await tester.pumpWidget(makeTestableWidgets(child: _customTabBar));
expect(find.byType(TabBar), findsOneWidget);
});
Если вам интересно makeTestableWidgets
. Эта функция просто предоставляет Material App для TabBar.
Widget makeTestableWidgets({Widget child}) {
return MaterialApp(
home: DefaultTabController(
length: 1,
child: Scaffold(
body: Container(),
bottomNavigationBar: _customTabBar,
),
),
);
}
В вашем тестовом примере замените строку
final tabBar = find.byType(TabBar).first as TabBar;
с
final tabBar = tester.widget(find.byType(TabBar)) as TabBar;
Я не проверял это сам, но думаю, что это сработает.