Что я делаю не так при написании widget - теста на Flutter?
Долгое время не могу понять в чем причина краша теста виджета в приложении на flutter, буду благодарен за любую помощь, и так, по-порядку:
- Предлагается ввести номер телефона, чтобы получить код подтверждения. На начальном этапе кнопка войти неактивная, нужно тапнуть на чекбокс с правилами и ввести номер телефона, тогда кнопка становится активной.
На скрине часть кода теста, которая отрабатывает корректно, проверяя, что открыт именно этот скрин.
- Далее мы заполняем номер телефона и тапаем чекбокс. Тесты со скрина проходят успешно: находим активную кнопку с градиентом и лоадер, тут все гуд!

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

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);
});
}



