Доступ к GetXController в тесте виджета Flutter
Я занимаюсь реализацией теста виджетов для экрана входа в систему. В приложении экран входа в систему предлагает пользователю переключатель управления для установки предпочтений для биометрических данных, если они доступны на устройстве.
Мы изучаем GetX, и нам нужно проверить это поведение в тесте виджетов. Экран входа в систему - это виджет без сохранения состояния, который загружает
GetXController
подкласс называется зависимостью. Этот класс контроллера содержит наблюдаемое логическое значение, называемое
canCheckBiometrics
, имеет сеттер, называемый
setBiometrics(bool newValue)
и используется для определения наличия переключателя управления. Виджет без сохранения состояния LoginView проверяет наличие биометрических данных с помощью
local_auth
package и соответственно вызывает setBiometrics. Отрывок кода из LoginView:
final controller = Get.put(LoginViewController());
Future<void> _checkForBiometrics() async {
bool enabled = await localAuth.canCheckBiometrics;
controller.setBiometrics(enabled);
}
Я бы хотел поиздеваться над
LoginViewController
класс в моем тесте виджетов и вызовите
setBiometrics
по мере необходимости для выполнения тестов. Ниже приведен раздел моего теста виджетов:
class MockLoginViewController extends Mock implements LoginViewController {}
void main(){
final controller = MockLoginViewController();
setUp(() { });
tearDown(() { });
group('Controls are present and functioning', () {
// ... other tests
testWidgets('Biometrics switcher present conditionally', (tester) async {
await tester.pumpWidget(const _LoginWrapper());
var biometricsSwitch = find.byKey(UIKeys.keySwitchBiometrics);
// if controller.canCheckBiometrics.value is true
// controller.setBiometrics(true);
// expect(biometricsSwitch, findsOneWidget);
// if controller.canCheckBiometrics.value is false
// controller.setBiometrics(false);
// expect(biometricsSwitch, findsNothing);
});
class _LoginWrapper extends StatelessWidget {
const _LoginWrapper({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(home: LoginView());
}
}
В
LoginView
должен быть завернут в
MaterialApp
избегать
MediaQuery
ошибки.
У меня вопрос: как связать
MockLoginViewController
с тестируемым виджетом, чтобы я мог переключать значение и проверять наличие переключателя? Или я все неправильно делаю?
ПРИМЕЧАНИЕ: я попытался попробовать
get_test
package, чтобы помочь с этим, но он не поддерживает нулевую безопасность и поэтому бесполезен.