【问题标题】:How to mock a static getter's return value in Dart or Flutter?如何在 Dart 或 Flutter 中模拟静态 getter 的返回值?
【发布时间】:2020-01-04 15:23:50
【问题描述】:

我想弄清楚如何为我在 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';
  }

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

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

【问题讨论】:

    标签: unit-testing flutter dart mockito platform


    【解决方案1】:

    您不应该模拟您不拥有的课程。您的单元测试必须独立于平台。在您的情况下,您应该重构代码以摆脱这种依赖关系。

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

    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

    【讨论】:

    • 主要思想不是mock这个静态变量,而是使用测试方法的onPlatform属性使用特定平台测试
    • 对不起上一条消息,我开始写答案,然后意识到我误读了一些东西。好像是我不小心把邮件的开头发了。
    • 你知道是否可以模拟静态吸气剂吗?我了解您的 POV,老实说,我所做的与您对抽象的建议相似,请参阅我问题的最后一段(“请注意,我知道此问题的解决方法”...)。我将检查我的用例编写集成测试的难度,谢谢您的提示。
    【解决方案2】:

    我同意 Jhionan Santos 的观点,但有一个例外,你不应该模拟你不拥有的课程

    在这个主题上,我们可以找到一个包装原始platform 的包以供测试。在我的情况下,我还需要 process 被嘲笑,所以我也找到了一个包。

    https://pub.dev/packages/platform

    https://pub.dev/packages/process

    我建议使用这些包,因为它们都归谷歌所有。

    【讨论】:

    • 有没有示例代码hot to mock 它?
    猜你喜欢
    • 2020-01-05
    • 2020-02-03
    • 1970-01-01
    • 2021-09-25
    • 2022-11-17
    • 2020-02-02
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多