我在测试发出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));
然而,当我运行测试时,我得到了以下异常: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));
在这个例子中,客户端被模拟成没有参数,但是我想这已经改变了,因为MockClient的文档现在也接受参数了。我不知道为什么会发生这个异常,在互联网上也找不到任何东西,所以我想知道这里是否有人知道为什么会发生这个异常。
2条答案
按热度按时间h5qlskok1#
package:http
的MockClient
有点用词不当,它并不是真正的mock(当然它也与package:mockito
的Mock
没有关系);它更像是一个 stub(或者可以说是一个伪代码):它具有旨在模拟普通X1 M4 N1 X对象实现。注意Flutter的Mockito examples使用
package:mockito
创建了一个MockClient
对象,但是这与package:http
本身提供的MockClient
类无关。package:http
的MockClient
需要一个MockClientHandler
的 instance 作为参数,但您试图传递的是MockClientHandler
type 本身。您需要提供一个实际的函数(同样,因为MockClient
有一个实际的实现)。换句话说,如果你想使用
package:http
的MockClient
,那么你应该这样做:或者,如果您希望使用
package:mockito
,则需要 * 完全 * 遵循https://flutter.dev/docs/cookbook/testing/unit/mocking并 * 生成 * 基于Mockito的MockClient
类。vjhs03f72#
这是文档的fetch_album_test.dart在更新时的样子!(测试通过)...