Flutter 在单元测试中覆盖环境变量

Ada*_*ths 7 unit-testing environment-variables dart flutter

在我的生产代码中,我使用该标志设置环境变量--DART-DEFINE,然后使用 检索它们String.fromEnvironment

如何覆盖String.fromEnvironment单元测试中返回的值,以测试我的生产代码如何响应不同的环境变量值?

jam*_*ley 5

将环境变量包装在类中,并使用您首选的依赖项注入或服务定位器包(例如get_it)从应用程序内访问注入的类。

你的environment_config.dart

class EnvironmentConfig {

    final String someValue;

    EnvironmentConfig({
      required this.someValue,
    });

    factory EnvironmentConfig.init() {
      const someValue = String.fromEnvironment('someEnvVar');
      return EnvironmentConfig(someValue: someValue);
    }
  
}
Run Code Online (Sandbox Code Playgroud)

main.dart

void main() {
    // instance can now be accessed from any class/widget within your app
    GetIt.I.registerSingleton<EnvironmentConfig>(EnvironmentConfig.init());

    runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)

然后在单元测试中,您可以EnvironmentConfig使用自己的值注入自己的实例:

void main() {
    setUp(() {
      final config = EnvironmentConfig(someValue: 'myCustomValue');
      GetIt.I.registerSingleton<EnvironmentConfig>(config);
    });

    tearDown(() {
      GetIt.I.reset();
    });

    test('Verify env vars', () {
      expect(GetIt.I<EnvironmentConfig>().someValue, equals('myCustomValue');
    });
}
Run Code Online (Sandbox Code Playgroud)

编辑:考虑到这是现在搜索答案时的最佳结果,值得注意的是,上述方法的权衡是它不适合树摇动,因为该类不是EnvironmentConfig编译时的使用工厂构造函数时为常量。