dart - 测试 Dart API 包装器

标签 dart

我目前正在为 wit.ai 编写 API 包装器。我想向此包装器添加测试,但考虑到我使用 http 库发送 HTTP 请求,我不确定如何执行此操作。

代码看起来像这样:

Future message(String q) {
    Map<String, String> headers = {
      'Accept': 'application/vnd.wit.${apiVersion}+json',
      'Authorization': 'Bearer ${token}'
    };
    return http
        .get('https://api.wit.ai/message?q=${q}', headers: headers)
        .then((response) {
      return JSON.decode(response.body);
    }).catchError((e, stackTrace) {
      return JSON.decode(e);
    });
  }

鉴于此代码,我将如何编写一个实际上不发送 HTTP 请求的测试?

最佳答案

传统上,这是通过依赖注入(inject)来解决的。您的 API 包装器类可以具有如下构造函数:

class MyWrapper {
  final http.BaseClient _httpClient;
  MyWrapper({BaseClient httpClient: new http.Client()})
      : _httpClient = httpClient;

  // ...
}

使用具有默认值的命名参数意味着普通用户无需担心创建 Client .

在您的方法中,您使用 Client 而不是使用 http 库的静态方法:

Future message(String q) {
  Map<String, String> headers = {
    'Accept': 'application/vnd.wit.${apiVersion}+json',
    'Authorization': 'Bearer ${token}'
  };
  return _httpClient
      .get('https://api.wit.ai/message?q=${q}', headers: headers)
      .then((response) {
    return JSON.decode(response.body);
  }).catchError((e, stackTrace) {
    return JSON.decode(e);
  });
}

但请记住,客户端需要关闭。如果您的 API 包装器上没有 close 方法,您可能需要 a) 添加它,或 b) 将依赖项注入(inject)放在 message() 方法上而不是在构造函数上。

测试时,set up a MockClient 。像这样传递:

var wrapper = new MyWrapper(httpClient: myMockClient);

无需运行本地服务器,而且速度更快。

关于dart - 测试 Dart API 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37485861/

相关文章:

android - 字体下意外的关键 Assets ((String)) - flutter 和 dart 中的移动应用程序错误

dart - 将 map 的值插入字符串

dart - 从重复列表中的自定义对象访问数据

listview - 如何在 Flutter 的粘性标题下对列表项进行分组

shared-libraries - Dart:Web 应用程序的库和导出

Dart pub publish 在身份验证后给出错误

flutter - Flutter重叠页面,详细信息帐户页面

android - 有没有办法让复合小部件在 flutter 中继承它所组成的小部件的属性?

dart - Flutter 上的异常 Firebase Auth,使用 vscode

flutter - 如何在 Dart/Flutter 中找到从一个列表匹配到另一个列表的所有元素的索引