Как получить доступ к переменным среды Flutter из тестов? - PullRequest
1 голос
/ 14 марта 2020

Я использовал flutter_dotenv для загрузки переменных окружения, сохраненных в .env по всему приложению, и на сегодняшний день все работает нормально. Хотя я пытаюсь писать тесты, я не могу получить к ним доступ из тестового файла.

import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  setUp(() async {
    await DotEnv().load();
  });

  test('Incorrect password should be rejected', () {
    var password = DotEnv().env['PASSWORD'];
    // stuff
  });
}

Результат выполнения теста:

Shell: [flutter_dotenv] Load failed: file not found
Shell: [flutter_dotenv] No env values found. Make sure you have called DotEnv.load()

Просто не могу кажется, найти файл .env. Я даже сделал копию .env в тестовом каталоге, но он тоже не распознал.

Я пытался использовать Platform.environment вместо flutter_dotenv для доступа к переменной, но это не сработало либо, возвращая ноль.

Извиняюсь, если я здесь глупый, я впервые пишу тесты Флаттера, но буду признателен за совет.

Обновление:

Вот как выглядит мой pubspec.yaml:

name: //name
description: //description

version: 1.0.0+3

environment:
  sdk: ">=2.1.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^0.1.2
  font_awesome_flutter: ^8.5.0
  flutter_youtube: ^2.0.0
  http: ^0.12.0+4
  flutter_dotenv: ^2.1.0
  google_fonts: ^0.3.7
  photo_view: ^0.9.2
  flutter_page_transition: ^0.1.0

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true
  assets:
    - images/
    - .env

1 Ответ

0 голосов
/ 01 апреля 2020

Добавьте TestWidgetsFlutterBinding.ensureInitialized(); в качестве первой строки основной функции вашего теста.

flutter_dotenv пытается получить доступ к ServicesBinding mixin, который взаимодействует с платформой вашего приложения. Вы должны инициализировать эту привязку прежде, чем получить к ней доступ, и приведенная выше строка кода будет гарантировать, что эта инициализация произойдет до запуска ваших тестов.

Ваш код должен выглядеть следующим образом:

import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_test/flutter_test.dart';

void main() async {
  TestWidgetsFlutterBinding.ensureInitialized();
  await DotEnv().load();

  setUp(() {
  // anything else you need to setup
  });

  test('Incorrect password should be rejected', () {
    var password = DotEnv().env['PASSWORD'];
    // stuff
  });
}
...