使用 Dart 模拟 HTTP 响应

标签 mocking dart dart-unittest dart-mock

我一直在开发一个新的 API 包装器,并且不想每次运行单元测试时都调用该 API。正如所描述的here ,我在 mock 它。

我最初以为我 mock 它的方式有问题,但问题似乎出在其他地方。

我想要完成的事情非常简单。当我的单元测试运行时,我想返回一个值,就像我从正在集成的外部 API 获取信息一样。

我使用 http.Client 作为可选参数来初始化我的类,这样我就可以在单元测试运行时将其传入:

SampleClass(String arg1, String arg2, [http.Client httpClient = null]) {
    this._arg1 = arg1;
    this._arg2 = arg2;
    _httpClient = (httpClient == null) ? http.Request : httpClient;
}

Future apiRequest(String resource, [Map<String, String> body]) {
    var url = buildBaseUrl(resource).toString();
    var request = new http.Request('POST', Uri.parse(url));
    request.bodyFields = body;
    return this._httpClient.send(request).then((response) => response.stream.bytesToString().then((value) => value.toString()));
}

在我的单元测试中,我创建了以下模拟类:

class HttpClientMock extends Mock implements http.Client {
  noSuchMethod(i) => super.noSuchMethod(i);
}

class HttpResponseMock extends Mock implements http.Response {
    noSuchMethod(i) => super.noSuchMethod(i);
}

在我的单元测试中检查响应,我正在执行以下操作:

test("Send SMS errors with wrong account", () {
    var mockHttpClient = new HttpClientMock()
                             ..when(callsTo('send')).alwaysReturn(message401);
    var sample = new SampleClass(_arg1, _arg2, mockHttpClient);
    future = sample.apiRequest(...parameters here...).then((value) => value.toString());
    expect(future.then((value) => JSON.decode(value)), completion(equals(JSON.decode(message401))));
});

因此,如您所见,我试图使其调用 send 返回 message401,它只是一个 JSON 字符串。

这不会发生,因为 message401 是一个字符串,并且因为我的代码尝试将它用作 Future,所以我总是收到错误:

Top-level uncaught error: Class 'String' has no instance method 'then'.

我完全理解为什么会出现此错误,但不知道如何解决它。

感谢任何帮助。

最佳答案

http 包有一个 testing libraryMockClient已经为您实现了。

关于使用 Dart 模拟 HTTP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24224525/

相关文章:

c++ - C++ 中的模拟对象是否总是需要虚拟方法或模板?

reactjs - 模拟交叉获取

flutter - 如何在 dart 中获取用户输入?

Dart - 如何针对调用 exit() 的函数编写测试?

dart - 为单元测试定义 “accept”和 “notAccept”匹配器的更好方法

unit-testing - 编写 unittest 并保存在单独的文件夹中

java - 如何通过 Mockito 模拟无法访问的第三方类属性

mocking - NSubstitute仅拦截 "setter"属性调用

websocket - 如何将 blob 转换为图像数据?

flutter - 产生 RenderBox 溢出的英雄动画