【问题标题】:flutter riverpod: how to test asyncvalue.error?flutter riverpod:如何测试 asyncvalue.error?
【发布时间】:2021-04-09 19:00:01
【问题描述】:

当我的 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 案例吗?

谢谢

【问题讨论】:

    标签: flutter testing widget riverpod


    【解决方案1】:

    而不是 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);
      });
    

    【讨论】:

    • @josharchibal 如果解决了您的问题,请将其标记为已接受的答案。
    猜你喜欢
    • 2020-11-11
    • 1970-01-01
    • 2021-10-20
    • 2023-02-07
    • 2021-12-28
    • 1970-01-01
    • 2021-05-06
    • 2021-03-19
    • 1970-01-01
    相关资源
    最近更新 更多