如何解决在 Dart 中模拟 http.Client 给出异常
我在测试发出 http 请求的类时遇到问题。 我想 Mock 客户端,这样每次客户端发出请求时,我都可以用 Mocked 响应来回答。 目前我的代码如下所示:
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));
但是,当我运行测试时,出现以下异常:
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,"title":"mock"}',200));
在这个例子中,客户端是在没有参数的情况下模拟的,但我想这已经改变了,因为 MockClient 的文档现在也接受一个参数。 我不知道为什么会发生此异常,并且在互联网上找不到任何内容,所以我想知道这里是否有人知道为什么会发生此异常。
解决方法
package:http
的 MockClient
有点用词不当。它不是真正的模拟(当然也与 package:mockito
的 Mock
无关);它更像是一个 存根(或者可以说是假的):它有一个旨在模拟普通 http.Client
对象的实现。
请注意,Flutter 的 Mockito examples 使用 MockClient
创建了一个 package:mockito
对象,但是这与 MockClient
本身提供的 package:http
类无关。
final fn = MockClientHandler;
final client = MockClient(fn as Future<Response> Function(Request));
package:http
的 MockClient
需要一个 MockClientHandler
的实例作为参数,但您试图传递 MockClientHandler
输入本身。您应该提供一个实际的函数(同样,因为 MockClient
有一个实际的实现)。
换句话说,如果你想使用package:http
的{{1}},那么你应该这样做:
MockClient
或者,如果您想使用 Future<Response> requestHandler(Request request) async {
return http.Response('{"userId": 1,"id": 2,"title": "mock"}',200));
}
final client = MockClient(requestHandler);
,则需要遵循 https://flutter.dev/docs/cookbook/testing/unit/mocking 完全 并生成一个基于 Mockito 的 {{1} } 类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。