flutter - flutter riverpod:如何测试 asyncvalue.error?
问题描述
当我的 Riverpod FutureProvider 返回 AsyncValue.error 时,我无法测试它。
我尝试了如下所示的测试:
// Future provider
final ipsProvider = FutureProvider.autoDispose((_) => IpRepository().fetchIps());
// Widget to be tested
class ExampleWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, ScopedReader watch) {
// hooks
AsyncValue<List<Ip>> ips = watch(ipsProvider);
return Container(
child: ips.when(
data: (data) => randomWidget,
loading: () => progressIndicator,
error: (_, stack) => Text('YesMan'),
),
);
}
}
// Test: I am trying to find a Text widget containing message 'YesMan'
testWidgets('ExampleWidget | error', (WidgetTester tester) async
await tester.pumpWidget(
ProviderScope(
overrides: [
ipsProvider.overrideWithValue(AsyncValue.error('randomErrorMessage')),
],
child: MaterialApp(
home: Builder(builder: (context) {
return ExampleWidget();
}),
),
),
);
final finderError = find.text('YesMan');
expect(finderError, findsOneWidget);
});
我希望测试返回带有消息“randomError”的文本小部件,但它会引发如下异常:
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK The following message was thrown running a test: randomErrorMessage When the exception was thrown, this was the stack:
关于如何在 Riverpod 中测试 AsyncValue.error 案例的任何想法?
谢谢
解决方案
而不是overrideWithValue
尝试overrideProvider
运行 future.error 所以 FutureProvider 抓住它
class ExampleWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, ScopedReader watch) {
// hooks
AsyncValue<String> ips = watch(ipsProvider);
return Container(
child: ips.when(
data: (data) => SizedBox(),
loading: () => CircularProgressIndicator(),
error: (_, stack) => Text('YesMan'),
),
);
}
}
testWidgets('ExampleWidget | error', (WidgetTester tester) async {
await tester.pumpWidget(
ProviderScope(
overrides: [
ipsProvider.overrideWithProvider(FutureProvider((_) => Future.error('error'))),
],
child: MaterialApp(
home: Builder(builder: (context) {
return ExampleWidget();
}),
),
),
);
expect(find.byType(CircularProgressIndicator), findsOneWidget);
await tester.pump();
final finderError = find.text('YesMan');
expect(finderError, findsOneWidget);
});
推荐阅读
- python - ValueError:无法配置处理程序“file_store”
- javascript - 如果在布局刀片中使用两个模态,如何显示特定模态,假设表单已验证并且何时返回错误
- optaplanner - 产生班次
- recursion - Prolog 上的递归
- c# - 如何禁用 chrome 新版本没有相同的站点标志
- slack - Slack 应用程序在添加传入的 webbook 时出错
- express - passport.initialize 不是函数
- python - 在 Python 中使用布尔函数条件简化 if-else 语句
- windows - 在 Windows 上使用 freeze_support() 进行 Python 多处理
- c - stm32F101 USART接收中断无效状态