我开发了一个Flutter单元测试中网络请求相关的工具

很长一段时间,我在写Flutter单元测试时都非常苦恼,网络请求和网络图片要本地模拟非常困难,尽管网络请求有像http_mock_adapter这样的库,但是它仅仅是为了Dio设计,无法用于其它网络请求库如http亦或者Dart自带的网络请求方式。还有网络图片处理也是一个难题,比如当我们使用截图测试时,业务中使用了Image.network,单元测试时就会抛出错误。

为了解决此类问题,我开发了一个工具http_miracle_mock,下面简单分享一下使用方式。

http_miracle_mock

Flutter项目的单元测试中拦截业务中的网络请求是一个很常见的场景,当前已有的框架有

此库的目的为了解决以下问题

  1. 简单好用
  2. 兼容主流网络请求框架,如dio、http
  3. 仅仅处理网络相关问题,如常见的网络请求与图片资源等

开始使用

引入依赖

yaml 复制代码
dev_dependencies:
  http_miracle_mock: any

简单使用

模拟一个Get请求

dart 复制代码
void main() async {
  TestWidgetsFlutterBinding.ensureInitialized();
  final HttpMiracleMock httpMiracleMock = HttpMiracleMock();
  final httpClient = HttpClient();
  test('test getUrl', () async {
      var url = 'https://example.com/create';
      var data = "resultGetUrl";
      var uri = Uri.parse(url);
      httpMiracleMock.open(url).reply(data);
      final request = await httpClient.getUrl(uri);
      final response = await request.close();
      var responseData = await response.transform(utf8.decoder).join();
      expect(responseData, data);
    });
}

模拟一个图片

dart 复制代码
testWidgets('test image using url png', (WidgetTester tester) async {
  var data = File(path.join(Utils.currentPath, 'test', 'assets', 'test.png'));
  var url = 'http://example.com/image.png';
  httpMiracleMock.open(url).reply(data.readAsBytesSync());
  await Utils.pumpWidgetWithImages(
    tester,
    Column(
      children: [
        Container(
            child: Image.network(
          url,
          width: 100,
          height: 100,
        )),
      ],
    ),
    [NetworkImage(url)],
  );
  await tester.pumpAndSettle();
  await expectLater(
    find.byType(Column),
    matchesGoldenFile('snapshots/net_work_image_1.png'),
  );
});

首先,初始化一下HttpMiracleMock,然后使用httpMiracleMock.open来提供需要拦截的网络请求的信息如请求链接、请求参数等,然后通过reply填入该请求的返回结果。

更多使用可以参考这里

接口

为了使用更加简单,该库仅提供HttpMiracleMock对象,该对象提供一个open接口。

open

open方法主要用于定义需要拦截请求的信息,有以下参数

  • url: 必填,拦截的请求链接,可选传入String,RegExp,Uri类型
  • method: 可选,拦截请求方法(GET/POST)
  • data: 可选,请求入参
  • dataTransform: 可选,用于请求参数转换,如果某些请求因为兼容问题无法解析请求参数,可以先通过此回调进行自定义转换

methoddatadataTransform都是可选参数,某些情况下比如url使用正则时会匹配到项目中多个不同请求,可以用这些更多的参数进行区分,让匹配更加精准。

该方法返回一个ResponseData

reply

  • body: 必填,返回的数据内容
  • statusCode: 可选,返回的状态的码
  • headers: 返回的头部信息

源码地址

相关推荐
GalenWu4 小时前
对象转换为 JSON 字符串(或反向解析)
前端·javascript·微信小程序·json
GUIQU.5 小时前
【Vue】微前端架构与Vue(qiankun、Micro-App)
前端·vue.js·架构
数据潜水员5 小时前
插槽、生命周期
前端·javascript·vue.js
2401_837088505 小时前
CSS vertical-align
前端·html
优雅永不过时·5 小时前
实现一个漂亮的Three.js 扫光地面 圆形贴图扫光
前端·javascript·智慧城市·three.js·贴图·shader
CodeCraft Studio6 小时前
报表控件stimulsoft教程:使用 JoinType 关系参数创建仪表盘
前端·ui
春天姐姐7 小时前
vue知识点总结 依赖注入 动态组件 异步加载
前端·javascript·vue.js
互联网搬砖老肖8 小时前
Web 架构之数据读写分离
前端·架构·web
钢铁男儿9 小时前
C# 方法(值参数和引用参数)
java·前端·c#
阿金要当大魔王~~9 小时前
面试问题(连载。。。。)
前端·javascript·vue.js