Mer*_*mus 4 mockito dart dart-mock dart-http
我在测试发出 http 请求的类时遇到问题。我想模拟客户端,以便每次客户端发出请求时,我都可以用模拟响应进行回答。目前我的代码如下所示:
final fn = MockClientHandler;
final client = MockClient(fn as Future<Response> Function(Request));
when(client.get(url)).thenAnswer((realInvocation) async =>
http.Response('{"userId": 1, "id": 2, "title": "mock"}', 200));
Run Code Online (Sandbox Code Playgroud)
但是,当我运行测试时,出现以下异常:
type '_FunctionType' is not a subtype of type '(Request) => Future<Response>' in type cast test/data_retrieval/sources/fitbit_test.dart 26:32 main
根据 Flutter/Dart Mockito 应该这样使用:
final client = MockClient();
// Use Mockito to return a successful response when it calls the
// provided http.Client.
when(client.get(Uri.parse('https://jsonplaceholder.typicode.com/albums/1')))
.thenAnswer((_) async => http.Response('{"userId": 1, "id": 2, "title":"mock"}', 200));
Run Code Online (Sandbox Code Playgroud)
在示例中,客户端是在没有参数的情况下进行模拟的,但我想这已经发生了变化,因为 MockClient 的文档现在也接受参数。我不知道为什么会发生这个异常,并且在互联网上找不到任何内容,所以我想知道这里是否有人知道为什么会发生这个异常。
package:http的MockClient有点用词不当。package:mockito它并不是真正的模拟(并且它肯定与s无关Mock);它更像是一个存根(或者可以说是一个假的):它有一个旨在模拟普通http.Client对象的实现。
请注意,Flutter 的Mockito 示例使用创建了一个MockClient对象package:mockito,但这与它本身提供的类无关MockClientpackage:http。
Run Code Online (Sandbox Code Playgroud)final fn = MockClientHandler; final client = MockClient(fn as Future<Response> Function(Request));
package:http需要a 的实例MockClient作为参数,但您试图传递类型本身。您应该提供一个实际的函数(同样,因为有一个实际的实现)。MockClientHandlerMockClientHandler MockClient
换句话说,如果你想使用package:https MockClient,那么你应该这样做:
Future<Response> requestHandler(Request request) async {
return http.Response('{"userId": 1, "id": 2, "title": "mock"}', 200));
}
final client = MockClient(requestHandler);
Run Code Online (Sandbox Code Playgroud)
或者如果你想使用package:mockito,你需要严格遵循https://flutter.dev/docs/cookbook/testing/unit/mocking 并生成一个基于 Mockito 的类。MockClient