【问题标题】:Mock different answers and exceptions after several calls with Mocktail在使用 Mocktail 多次调用后模拟不同的答案和异常
【发布时间】:2021-10-23 11:30:57
【问题描述】:

我使用mocktail 进行单元测试,但在第一次调用时找不到抛出异常的方法,但后来在第二次调用接听正确的输出。

我可以找到this solution 以获得两个不同的答案,但这不足以测试抛出的异常。所以我需要想出一个修改后的解决方案。

这就是我想要实现的。顺便说一句,我正在使用 http get 测试连接重试。

import 'package:http/http.dart' as http;
import 'package:mocktail/mocktail.dart';

class MockClient extends Mock implements http.Client {}

final mockClient = MockClient();

//First time fails, second one retrieves a result. This doesn't work on Mocktail
when(() => mockClient.get(Uri.parse(url)))
  .thenThrow(SocketException()) // Call 1
  .thenAnswer((_) => Future.value(http.Response("page content", 200)) // Call 2
);

【问题讨论】:

    标签: flutter unit-testing dart mockito


    【解决方案1】:

    尝试不同的想法后,一个可能的解决方案是将每个答案存储在 List

    import 'package:http/http.dart' as http;
    import 'package:mocktail/mocktail.dart';
    
    class MockClient extends Mock implements http.Client {}
    
    final mockClient = MockClient();
    
    final List<Future<http.Response> Function(Invocation)> answers = [
     (_) => throw SocketException(),
     (_) => Future.value(http.Response("page content", 200)),
    ];
    
    
    when(() => mockClient.get(Uri.parse(url)))
      .thenAnswer((invocation) => answers.removeAt(0)(invocation));
    // Calling answers.removeAt(0) without the lambda method returns the same answer on all of them
    
    

    在此示例中,Invocation 未使用,仅检查 2 个连续调用。但这种行为可以从您在此处看到的内容进行扩展。

    我没有用 Mockito 尝试过这个,但它应该以类似的方式调整语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      相关资源
      最近更新 更多