如何在 Dart 或 Flutter 中模拟静态 getter 的返回值?

Vin*_*rga 6 platform unit-testing mockito dart flutter

我想弄清楚如何修改 Flutter 和 Dart 中单元测试的静态 getter 的返回值。

我正在对一个简单的功能进行单元测试:

  Future<bool> exampleFunc() async {
    if (Platform.isIOS) {
      // Do some iOS-specific things
      return false;
    } else if (Platform.isAndroid) {
      // Do some Android-specific things
      return true; // just as an example
    }
    throw 'Unexpected platform';
  }
Run Code Online (Sandbox Code Playgroud)

我想修改类的静态 getter 的返回值:我想调整Platform.isIOS不同Platform.isAndroid测试用例的返回值。

请注意,我知道这个问题的解决方法,例如,我可以将函数拆分为两个函数(每个平台一个),我可以注入我自己的函数enum(或者在这种情况下,甚至bool可以工作)来代表受支持的平台。在这个例子中,我实际上打算这样做,但我想知道如何“修改”类的Platformgetter 的返回值,因为有时,您不想像其他人那样修改函数的签名依赖它,但您仍然想对该函数进行单元测试。

Jhi*_*tos 4

您不应该模拟不属于您的类。您的单元测试必须独立于平台。根据您的情况,您应该重构代码以摆脱这种依赖性。

如果你真的想继续这种依赖,至少取决于抽象:

abstract class MyPlatform {
  bool isAndroid();
  bool isIos();
 }

class MyPlatformImp implements MyPlatform {
  @override
  bool isAndroid() => Platform.isAndroid;
  @override
  bool isIos() => Platform.isIOS;
 }
Run Code Online (Sandbox Code Playgroud)

然后您可以根据您的用途模拟 MyPlatform。

您将在集成测试中测试这种变量 https://flutter.dev/docs/cookbook/testing/integration/introduction

您还可以使用 test() 的 onPlatform 属性为平台创建不同的测试 https://api.flutter.dev/flutter/test_api/test.html