使用 Mocktail 多次调用后模拟不同的答案和异常
Mock different answers and exceptions after several calls with Mocktail
我正在使用 mocktail 进行单元测试,但我找不到在 第一次调用 [=23] 时 抛出 异常的方法=] 但稍后,在 第二次调用 时,answer 具有正确的输出。
我可以找到 两个不同的答案,但这不足以测试抛出的异常。所以我需要想出一个修改的解决方案。
这就是我想要实现的。顺便说一下,我正在用 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
);
尝试不同的想法后,一个可能的解决方案是将每个答案存储在 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 试过这个,但它应该以类似的方式工作,调整语法。
我正在使用 mocktail 进行单元测试,但我找不到在 第一次调用 [=23] 时 抛出 异常的方法=] 但稍后,在 第二次调用 时,answer 具有正确的输出。
我可以找到
这就是我想要实现的。顺便说一下,我正在用 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
);
尝试不同的想法后,一个可能的解决方案是将每个答案存储在 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 试过这个,但它应该以类似的方式工作,调整语法。