Что я делаю не так при написании widget - теста на Flutter?

Долгое время не могу понять в чем причина краша теста виджета в приложении на flutter, буду благодарен за любую помощь, и так, по-порядку:

Скрин авторизации по номеру телефона

  1. Предлагается ввести номер телефона, чтобы получить код подтверждения. На начальном этапе кнопка войти неактивная, нужно тапнуть на чекбокс с правилами и ввести номер телефона, тогда кнопка становится активной. введите сюда описание изображения На скрине часть кода теста, которая отрабатывает корректно, проверяя, что открыт именно этот скрин.

введите сюда описание изображения введите сюда описание изображения введите сюда описание изображения

  1. Далее мы заполняем номер телефона и тапаем чекбокс. Тесты со скрина проходят успешно: находим активную кнопку с градиентом и лоадер, тут все гуд! введите сюда описание изображения введите сюда описание изображения
  2. Далее должна перейти смена роута и мы должны попасть на скрин ввода кода из смс, но этого не происходит, обращение к АПИ бэкенда мокаю, тут вроде как все норм. Ниже оставлю файл с полным тестом. По итогу падает ошибка. введите сюда описание изображения Что делаю не так не понимаю, если я неправильно подставляю ответ от замоканного сервиса, то тест крашится на этом шаге, а на текущий момент видно, что тест отрабатывает корректно до лоадера на кнопке. Поделитесь пожалуйста опытом, подскажите как решить проблему. Ниже, собственно тот метод, который вызывается по нажатию на кнопку "Войти". введите сюда описание изображения

import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:go_router/go_router.dart';
import 'package:mocktail/mocktail.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:tempojob/models/send_sms_code_for_login_model.dart';
import 'package:tempojob/providers/auth_provider.dart';
import 'package:tempojob/screens/auth/sms_check_screen.dart';
import 'package:tempojob/screens/auth/welcome_screen.dart';
import 'package:equatable/equatable.dart';
import 'package:tempojob/screens/widgets/linear_gradient_button_widget.dart';
import 'package:tempojob/services/api/user_api_service.dart';
import 'package:tempojob/utils/colors.dart';

class Routes extends Equatable {
  static const home = '/';
  static const welcome = '/auth/welcome';
  static const smsCheck = '/auth/sms_check';

  @override
  List<Object?> get props => [home, welcome, smsCheck];
}

String getRouterKey(String route) {
  return 'key_$route';
}

extension PumpApp on WidgetTester {
  Future<void> pumpRouterApp(Widget widget) {
    const initialLocation = '/';

    final _router = GoRouter(
      initialLocation: initialLocation,
      routes: [
        GoRoute(
          path: initialLocation,
          builder: (context, state) => widget,
        ),
        ...Routes()
            .props
            .map(
              (e) => GoRoute(
                path: e! as String,
                builder: (context, state) => Container(
                  key: Key(
                    getRouterKey(e as String),
                  ),
                ),
              ),
            )
            .toList()
      ],
    );

    return pumpWidget(
        MultiProvider(
          providers: [
            ChangeNotifierProvider<AuthProvider>(create: (_) => AuthProvider(const FlutterSecureStorage()))
          ],
          child: MaterialApp.router(
            routeInformationParser: _router.routeInformationParser,
            routerDelegate: _router.routerDelegate,
          )
        )
    );
  }
}

class MockUserApiService extends Mock implements UserApiService {}

void main() {
  late MockUserApiService mockUserApiService;

  setUp(() {
    WidgetsFlutterBinding.ensureInitialized();
    mockUserApiService = MockUserApiService();
  });

  testWidgets('is redirected when button is tapped', (tester) async {
    const phone = '1231231212';
    SharedPreferences.setMockInitialValues({
      'phone': phone
    });

    when(() => mockUserApiService.sendSmsCodeForLogin(any())).thenAnswer((_) async {
      return sendSmsCodeForLoginModelFromJson('{"success": true, "message": "Sended"}');
    });

    await tester.pumpRouterApp(
      WelcomeScreen(mockUserApiService),
    );

    expect(find.byType(WelcomeScreen), findsOneWidget);

    await tester.enterText(find.byKey(const Key('PhoneTextFormField')), phone);
    await tester.tap(find.byKey(const Key('RulesCheckBox')));
    await tester.pumpAndSettle();

    expect(
        ((tester.firstWidget(find.byType(Ink)) as Ink).decoration
                as BoxDecoration)
            .gradient,
        const LinearGradient(
          begin: Alignment.topCenter,
          end: Alignment.bottomCenter,
          colors: [
            TempojobColors.orange,
            TempojobColors.paleOrange,
          ],
        ));

    await tester.tap(find.byType(LinearGradientButton));
    await tester.pump();

    expect(((tester.firstWidget(find.byType(CircularProgressIndicator)) as CircularProgressIndicator).color),
        Colors.white);

    await tester.pumpAndSettle();

    expect(find.byType(SmsCheckScreen), findsOneWidget);
  });
}


Ответы (0 шт):