【问题标题】:How to access Flutter environment variables from tests?如何从测试中访问 Flutter 环境变量?
【发布时间】:2020-06-26 10:20:12
【问题描述】:

我一直在使用 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 来访问变量,但这也不起作用,返回 null。

抱歉,如果我在这里很傻,这是我第一次编写 Flutter 测试,但希望得到建议。

更新:

这就是我的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

【问题讨论】:

  • 你能发布你的pubspec.yaml吗? flutter_dotenv pub 页面表示需要将 .env 文件添加为资产。
  • 抱歉@MichaelP. 回复缓慢,没有注意到您的评论。更新了我的问题!

标签: flutter flutter-test


【解决方案1】:

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

【讨论】:

  • 如果测试需要http连接,在上述解决方案中,每个请求都会以http 400错误结束。您可以通过以下方式绕过 httpClient 模拟: import 'dart:io' as io; // 新行 //... TestWidgetsFlutterBinding.ensureInitialized(); io.HttpOverrides.global = null; // 新行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
相关资源
最近更新 更多