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

源码地址

相关推荐
神秘的猪头4 分钟前
🌐 CSS 选择器详解:从基础到实战
前端·javascript
远山枫谷6 分钟前
CSS选择器优先级计算你真的会吗?
前端·css
Forever_xl6 分钟前
埋点监控平台全景调研
前端
神秘的猪头6 分钟前
JavaScript 中的 `map()` 方法详解与面向对象编程初探
前端·javascript
有点笨的蛋7 分钟前
这些 CSS 小细节没处理好,你的页面就会“闪、抖、卡”——渲染机制深度拆解
前端·css
2501_915918417 分钟前
Flutter 加固方案对比与实战,多工具组合的跨平台安全体系(Flutter App 加固/IPA 成品混淆/Ipa Guard CLI/自动化安全流程)
安全·flutter·ios·小程序·uni-app·自动化·iphone
Bryce李小白9 分钟前
Flutter中mixing的原理及应用场景
flutter
烟袅9 分钟前
JavaScript 中 map 与 parseInt 的经典陷阱:别再被“巧合”骗了!
前端·javascript
烟袅11 分钟前
JavaScript 中 string 与 new String() 的本质区别:你真的懂“字符串”吗?
前端·javascript
_大学牲11 分钟前
从 0 到上架:用 Flutter 一天做一款功德木鱼
前端·flutter·apple