使用 Mocktail 多次调用后模拟不同的答案和异常

Cav*_*dev 3 unit-testing mockito dart flutter

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

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

这就是我想要实现的目标。顺便说一下,我正在使用 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
);
Run Code Online (Sandbox Code Playgroud)

Cav*_*dev 5

在尝试了不同的想法之后,一个可能的解决方案是将每个答案存储在一个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

Run Code Online (Sandbox Code Playgroud)

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

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