0

AsyncValue.error を返すとき、Riverpod FutureProvider のテストに問題があります。

以下のようにテストしてみました。

// 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 ケースをテストする方法について何か考えはありますか?

ありがとうございました

4

1 に答える 1

0

overrideWithValuefuture.error を試行して実行する代わりにoverrideProvider、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);
  });
于 2021-01-06T03:05:35.467 に答える