dart - 如何模拟 HttpClientResponse 以返回一个字符串

标签 dart flutter flutter-test

在重构为 dart:io.HttpClient 之后,我正在尝试编写一个测试 https://flutter.io/networking/

一切似乎都很好,直到

var responseBody = await response.transform(utf8.decoder).join();

以下测试抛出 NoSuchMethodError:方法 'join' 被调用为 null。

MockHttpClient http = new MockHttpClient();
MockHttpClientRequest request = new MockHttpClientRequest();
MockHttpHeaders headers = new MockHttpHeaders();
MockHttpClientResponse response = new MockHttpClientResponse();
MockStream stream = new MockStream();
when(http.getUrl(Uri.parse('http://www.example.com/')))
    .thenReturn(new Future.value(request));
when(request.headers)
    .thenReturn(headers);
when(request.close())
    .thenReturn(new Future.value(response));
when(response.transform(utf8.decoder))
    .thenReturn(stream);
when(stream.join())
    .thenReturn(new Future.value('{"error": {"message": "Some error"}}'));

我确实看到了 How to mock server response - client on server side ,但它使用了 http 包,而不是 dart:io。

我也试过https://github.com/flutter/flutter/blob/master/dev/manual_tests/test/mock_image_http.dart但这也会返回 null。

非常感谢!

最佳答案

问题是,当您模拟流时,您实际上需要实现大量不同的方法才能使其正常工作。如果您喜欢 flutter repo 中的示例,最好使用真正的 Stream。为确保您的正文设置正确,请使用 utf8 编码器。

final MockHttpClientResponse response = new MockHttpClientResponse();
// encode the response body as bytes.
final List<int> body = utf8.encode('{"foo":2}');

when(response.listen(typed(any))).thenAnswer((Invocation invocation) {
  final void Function(List<int>) onData = invocation.positionalArguments[0];
  final void Function() onDone = invocation.namedArguments[#onDone];
  final void Function(Object, [StackTrace]) onError = invocation.namedArguments[#onError];
  final bool cancelOnError = invocation.namedArguments[#cancelOnError];
    return new Stream<List<int>>.fromIterable(<List<int>>[body]).listen(onData, onDone: onDone, onError: onError, cancelOnError: cancelOnError);
});

关于dart - 如何模拟 HttpClientResponse 以返回一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49642113/

相关文章:

flutter - 在 Flutter 中导航时如何停止 radio 流?

flutter - getter 'isEmpty'在null上被调用

flutter - 如何显示数组中每个项目的小部件?

flutter - 如何仅针对 Flutter 中的某些类防止设备旋转?

dart - 在 Flutter 应用程序中作为后台任务在二级隔离中获取地理位置

flutter - 如何注销Facebook帐户以进入另一个帐户

dart - 如何在 Flutter 中制作两个 float 操作按钮?

flutter - 如何在flutter中清除应用程序的全部数据

dart - 如何将多个监听器分配给单个StreamSubscription?

flutter - Flutter-如何使可重复使用的按钮更改其图像和颜色?