微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Dart 中模拟 http.Client 给出异常

如何解决在 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:httpMockClient 有点用词不当。它不是真正的模拟(当然也与 package:mockitoMock 无关);它更像是一个 存根(或者可以说是假的):它有一个旨在模拟普通 http.Client 对象的实现。

请注意,Flutter 的 Mockito examples 使用 MockClient 创建了一个 package:mockito 对象,但是这与 MockClient 本身提供的 package:http 类无关。

final fn = MockClientHandler;
final client = MockClient(fn as Future<Response> Function(Request));

package:httpMockClient 需要一个 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 举报,一经查实,本站将立刻删除。