关闭

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

发表于:2024-3-25 09:56

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:幺风    来源:稀土掘金

  很长一段时间,我在写Flutter单元测试时都非常苦恼,网络请求和网络图片要本地模拟非常困难,尽管网络请求有像http_mock_adapter这样的库,但是它仅仅是为了Dio设计,无法用于其它网络请求库如http亦或者Dart自带的网络请求方式。还有网络图片处理也是一个难题,比如当我们使用截图测试时,业务中使用了Image.network,单元测试时就会抛出错误。
  为了解决此类问题,我开发了一个工具http_miracle_mock,下面简单分享一下使用方式。
  http_miracle_mock
  Flutter项目的单元测试中拦截业务中的网络请求是一个很常见的场景,当前已有的框架有
  ·mockito: 不够简洁,需要大量代码
  · http_mock_adapter: 仅支持Dio库
  · network_image_mock: 仅支持图片
  此库的目的为了解决以下问题
  1. 简单好用
  2. 兼容主流网络请求框架,如dio、http
  3. 仅仅处理网络相关问题,如常见的网络请求与图片资源等
  开始使用
  引入依赖
  dev_dependencies:
    http_miracle_mock: any
  简单使用
  模拟一个Get请求:
  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);
      });
  }
  模拟一个图片:
  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: 可选,用于请求参数转换,如果某些请求因为兼容问题无法解析请求参数,可以先通过此回调进行自定义转换
  method、data、dataTransform都是可选参数,某些情况下比如url使用正则时会匹配到项目中多个不同请求,可以用这些更多的参数进行区分,让匹配更加精准。
  该方法返回一个ResponseData
  reply
  ·body: 必填,返回的数据内容
  · statusCode: 可选,返回的状态的码
  · headers: 返回的头部信息
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号