【问题标题】:How to mock database in flutter如何在颤振中模拟数据库
【发布时间】:2020-12-15 13:42:42
【问题描述】:

我试图模拟数据库来测试我的本地 api,我在官方文档中搜索找到可以与远程 api 正常工作的 mockito,但也不能与本地数据库一起工作,有什么办法可以解决它?

【问题讨论】:

    标签: flutter mockito sqflite


    【解决方案1】:

    在这些情况下,您有两种选择(以及许多其他选择)。即使我的示例假设您正在进行 HTTP 调用,也没关系。无论我公开的具体用例如何,您都可以使用这些策略!


    第一个是使用“策略模式”为 API 创建接口,然后在测试和生产 API 之间切换。这是一个简单的例子:

    abstract class HttpRepository {
      const HttpRepository();
    
      Future<Something> sendRequest();
    }
    

    您现在可以创建 2 个具体的类:一个用于实际的 API 调用,另一个只是用于测试的模拟。

    /// Use this in your tests
    class MockHttpRepository extends HttpRepository {
      const MockHttpRepository();
    
      @override
      Future<Something> sendRequest() async {
        // Simulating the HTTP call
        await Future.delayed(const Duration(seconds: 2));
        return Something();
      }
    }
    
    /// Use this in your Flutter code to make the actual HTTP call or whatever else
    class ApiHttpRepository extends HttpRepository {
      const ApiHttpRepository();
    
      @override
      Future<Something> sendRequest() async {
        // Doing a real HTTP call
        final response = await makeGetOrPost();
        return Something.withData(response);
      }
    }
    

    这样,您将在 Flutter 应用中使用 ApiHttpRepository,在测试中使用 MockHttpRepository。尽可能使用const 构造函数。


    另一种方法是使用模拟来模拟虚假的 HTTP 调用或其他任何东西。基本上,您使用when 来“捕获”方法调用并返回您可以控制的虚假响应。

    // 1. "Enable" mocking on your type
    class MockRepo extends Mock implements ApiHttpRepository {}
    
    // 2. Mock methods
    const ApiHttpRepository repo = MockRepo();
    when(repo.sendRequest()).thenAnswer((_) async => Something());
    

    在本例中,我们使用thenAnswer,因为sendRequest() 的返回类型是Future&lt;T&gt; 类型。在您的情况下,如果您从数据库中读取数据,您只需要:

    1. 使用extends Mock implements YourClass 使您的课程“可模拟”
    2. 在可模拟实例上使用when 并控制输出

    如果该方法在所有其他情况下返回 Future&lt;T&gt;thenReturn,请确保使用 thenAnswer

    【讨论】:

    • 如何接受这个答案? OP 询问有关 moking 数据库而不是 Remote Api 的问题... smh
    猜你喜欢
    • 2021-07-22
    • 2023-03-14
    • 2019-03-17
    • 2021-05-21
    • 2021-09-25
    • 2021-08-07
    • 2020-08-02
    • 1970-01-01
    • 2019-01-21
    相关资源
    最近更新 更多