我开发了一个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: 返回的头部信息

源码地址

相关推荐
就是蠢啊1 小时前
CSS 的元素显示模式简单学习
前端·css
全栈技术负责人4 小时前
vue3中使用nexttick
前端·javascript·vue.js
程楠楠&M4 小时前
uni-app页面调用接口和路由(四)
前端·vue.js·小程序·uni-app·flex布局·弹性布局
hmz3604 小时前
最新绿豆影视系统 /反编译版源码/PC+WAP+APP端 /附搭建教程+软件
前端·后端·php
L_cl5 小时前
JavaWeb JavaScript 11.XML —— 配置文件
xml·java·前端
HED6 小时前
【前端学算法】排序算法知多少(二)
前端·javascript
小夏同学呀6 小时前
vue3ElementPlus使两个日期联动控制(限制结束时间为开始时间的一个月)
前端·javascript·vue.js
变形金刚卖人寿保险还是汽车保险6 小时前
element-plus表格操作
前端·javascript·vue.js
A阳俊yi6 小时前
Vue(16)——Vue3.3新特性
前端·javascript·vue.js
小白小白从不日白6 小时前
react hooks--React.memo
前端·javascript·react.js