我想弄清楚如何为Flutter和Dart中的单元测试修改静态 setter/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';
  }

我想修改一个类的静态获取方法的返回值:我想针对不同的测试用例调整Platform.isIOSPlatform.isAndroid的返回值。

请注意,我知道此问题的解决方法,例如,我可以将函数拆分为两个函数(每个平台一个),可以注入(inject)自己的enum(或者在这种情况下,甚至bool都可以工作)来表示支持的平台。在此示例中,我实际上将这样做,但是我想知道如何“修改” Platform类的getter的返回值,因为有时您不希望像其他方法一样修改函数的签名。可能取决于它,但是,您仍然想对功能进行单元测试。

最佳答案

您不应该 mock 您不拥有的类。您的单元测试必须与平台无关。根据您的情况,您应该重构代码以摆脱这种依赖性。

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

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

class MyPlatformImp implements MyPlatform {
  @override
  bool isAndroid() => Platform.isAndroid;
  @override
  bool isIos() => Platform.isIOS;
 }

那么您就可以在使用时模拟MyPlatform。

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

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

关于unit-testing - 如何在Dart或Flutter中模拟静态 getter 的返回值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59592097/

10-10 15:28