我使用WeatherAPI实现了一个应用程序,就像ResoCoder示例中一样。我现在想测试是否每个文本小部件都显示了正确的信息,但我已经找不到文本小部件了(我用过这个指南https://resocoder.com/2021/01/02/flutter-integration-test-tutorial-firebase-test-lab-codemagic/)。我尝试过使用find.byKey(((当然之前设置了一些键(和find.byText((,但都不起作用。
我的测试代码:
testWidgets('Infos are displayed', (WidgetTester tester) async {
await tester.pumpWidget(MaterialApp(home: WeatherScreen()));
await tester.pump();
final tempField = find.byKey(ValueKey("temperature"));
expect(tempField, findsOneWidget);
expect(find.text('humidity'), findsOneWidget);
});
我总是得到一个错误,没有找到那些小部件:
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════
The following TestFailure object was thrown running a test:
Expected: exactly one matching node in the widget tree
Actual: _KeyFinder:<zero widgets with key [<'temperature'>] (ignoring offstage widgets)>
Which: means none were found but one was expected
还有我的屏幕小部件:
class WeatherScreen extends StatelessWidget {Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: BlocBuilder<WeatherCubit, WeatherBaseState>(
bloc: WeatherCubit(weatherRepository: WeatherRepository())..getWeather(),
builder: (context, state) {
if (state is LoadingWeather) {
return CircularProgressIndicator();
} else if (state is WeatherLoaded) {
return Column(my widget stuff with text widgets to be found);
}
天气屏幕使用BlocBuilder
,在测试时,您不会向该小部件提供任何BLoC。您应该做的是用BlocProvider包装您的MaterialApp
或WeatherScreen
,并提供您的WeatherCubit
,例如:
await tester.pumpWidget(
MaterialApp(home:
BlocProvider<WeatherCubit>.value(
value: weatherCubit,
child: WeatherScreen(),
)
),
);
在此之前,您还应该模拟weatherCubit
值并定义所需的状态。你可以在这里找到一个简单的例子:https://github.com/felangel/bloc/blob/master/examples/flutter_counter/test/counter/view/counter_view_test.dart