如何在 Flutter 中对依赖于 3rd-Party-Package 的代码进行单元测试?

Posted

技术标签:

【中文标题】如何在 Flutter 中对依赖于 3rd-Party-Package 的代码进行单元测试?【英文标题】:How to Unit Test code that is dependent on 3rd-Party-Package in Flutter? 【发布时间】:2020-08-02 15:47:30 【问题描述】:

如何在 Flutter 中测试依赖于 path_provider 插件的代码?

对依赖于 path_provider 插件的代码执行测试时,出现以下错误:

  MissingPluginException(No implementation found for method getStorageDirectory on channel plugins.flutter.io/path_provider)
  package:flutter/src/services/platform_channel.dart 319:7                         MethodChannel.invokeMethod
  ===== asynchronous gap ===========================
  dart:async                                                                       _asyncErrorWrapperHelper
  package: mypackage someClass.save
  unit_tests/converter_test.dart 19:22   

                                 main.<fn>

【问题讨论】:

你没有模拟getStorageDirectory吗? 我该怎么做?我以前从未使用过模拟 使用此链接:flutter.dev/docs/development/data-and-backend/json 【参考方案1】:

您需要模拟被测试代码调用的所有方法(如果它调用它们并依赖于它们的结果)

在您的情况下,您应该模拟方法 getStorageDirectory() 以使其返回一些满足您的测试的结果

有关如何模拟检查 this 和 this 的更多信息

如何模拟的简短示例:

class MyRepo
  int myMethod()
    return 0;
  


class MockRepo extends Mock implements MyRepo

void main()
  MockRepo mockRepo = MockRepo();
  test('should test some behaviour',
          () async 
            // arrange
            when(mockRepo.myMethod()).thenAnswer(1);//in the test when myMethod is called it will return 1 and not 0
            // act
            //here put some method that will invoke myMethod on the MockRepo and not on the real repo
            // assert
            verify(mockRepo.myMethod());//verify that myMethod was called
          ,
        );

【讨论】:

感谢您的回答 :) 我用 Mockito 创建了一个 Mock。那么如何确保在应该测试的方法中使用了 mock impl?我正在对一种名为 convert 的方法进行单元测试。此方法使用存储库类。我嘲笑了存储库类。但是如何让 convert 方法使用 mock impl? 如果回答您的问题,请将答案标记为正确,我将编辑答案以显示模拟示例

以上是关于如何在 Flutter 中对依赖于 3rd-Party-Package 的代码进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中对列表进行排序 [重复]

如何在 Flutter 中使用 Google API?

在 Flutter Web 应用程序中对 http 和 https API 服务器的 http GET 请求发生异常

如何在 Flutter 中对 DataTable 小部件上的 Future<List> 数据类型进行排序?

在 Flutter 中对未来列表进行排序

Flutter 平台特定依赖项