Настройка локали в интеграционном тесте flutter с использованием пакета integration_test

#flutter #integration-testing

#flutter #интеграция-тестирование

Вопрос:

Я пытаюсь собрать тест с использованием пакета integration_test, который устанавливает определенную локаль перед запуском теста. Я попробовал следующее (что близко к тому, что работает в WidgetTests):

     await tester.binding.setLocale('en', 'US');
    app.main();
    await tester.idle();
    await tester.pumpAndSettle();

    // The app is still using the default locale of the phone...
  

Нужно ли это устанавливать в драйвере? Вот моя текущая настройка в драйвере:

   // Some adb commands for granting permissions...
  print('Starting test.');
  final FlutterDriver driver = await FlutterDriver.connect();
  final String data = await driver.requestData(
    null,
    timeout: const Duration(minutes: 1),
  );
  await driver.close();
  // Some more adb commands to revoke permissions.
  

Похоже, это не работает.

Я нашел эту проблему здесь, но она не использует integration_test пакет и, следовательно, имеет совершенно другую настройку.

Ответ №1:

Я смог локализовать свои интеграционные тесты, обернув мой целевой виджет в Localizations виджет. Что-то вроде:

 class WidgetTestWrapper extends StatelessWidget {
  const WidgetTestWrapper({
    Key? key,
    required this.locale,
    required this.child,
  }) : super(key: key);

  final Widget child;
  final Locale locale;

  static const localizationsDelegates = <LocalizationsDelegate>[
    S.delegate,
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
  ];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Material(
        child: Localizations(
          locale: locale,
          delegates: localizationsDelegates,
          child: child,
        ),
      ),
    );
  }
}
  

Затем я передаю желаемое Locale для теста в вызове runApp .

Например, для испанских США (es-US):

 runApp(WidgetTestWrapper(locale: const Locale('es', 'US'), child: widgetUnderTest));