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

标签 unit-testing flutter dart mockito platform

我想弄清楚如何为我在 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不同测试用例的返回值。

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

最佳答案

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

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

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/

相关文章:

dart - 如何在抽象类中声明工厂构造函数?

android-studio - 如何在 Dart 或 Flutter 项目中重构 Android Studio 中的文件名?

python - 如何模拟类的函数的返回值?

css - flutter 相当于关闭 CSS 背景过滤器 : blur(20px) saturation(180%)

Flutter TabBar 第一个标签上不需要的空间

android - Flutter - 解析 HTML 数据时出错

dart - 从 JSON 中获取数据并添加到 initState() 上的列表中

c# - 为什么 ConfigurationManager.OpenMappedExeConfiguration 有一个额外的连接字符串不在文件中?

php - 没有在 PHPUnit 中运行一些测试?

php - 在 phpunit 中有没有一种方法可以为数组中的键断言两个值?