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

源码地址

相关推荐
h周杰偷17 分钟前
vue 预览pdf 【@sunsetglow/vue-pdf-viewer】开箱即用,无需开发
前端·vue.js·pdf
小孙姐40 分钟前
3——VUE侦听器和计算属性
前端·javascript·vue.js
Dragon Wu1 小时前
Taro React小程序开发框架 总结
前端·react.js·前端框架·taro
nbsaas-boot1 小时前
消息队列场景下的前端设计:如何优化用户体验
前端·ux
sususugaa1 小时前
前端框架Vue3——响应式数据,v-on,v-show和v-if,v-for,v-bind
开发语言·前端·vue.js·前端框架
珹洺3 小时前
从 HTML 到 CSS:开启网页样式之旅(三)—— CSS 三大特性与 CSS 常用属性
前端·javascript·css·网络·html·tensorflow·html5
T^T尚7 小时前
uniapp H5上传图片前压缩
前端·javascript·uni-app
出逃日志8 小时前
JS的DOM操作和事件监听综合练习 (具备三种功能的轮播图案例)
开发语言·前端·javascript
XIE3928 小时前
如何开发一个脚手架
前端·javascript·git·npm·node.js·github
山猪打不过家猪8 小时前
React(五)——useContecxt/Reducer/useCallback/useRef/React.memo/useMemo
前端·javascript·react.js