Flutter widget测试使用SvgPicture.asset加载SVG资源失败如何解决?
解决方案
报错的核心原因是Flutter widget测试环境默认不会加载项目生产环境声明的asset资源,导致SvgPicture.asset无法找到对应的svg文件抛出异常。你可以根据你的测试需求选择以下任意一种方案解决:
方案1:使用flutter_svg官方测试工具(推荐,适合仅验证组件结构的场景)
无需准备真实svg资源,只需要在测试启动前调用flutter_svg提供的测试mock方法,即可让测试跳过资源加载逻辑,不会抛出异常:
import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/test.dart'; // 导入测试工具 import 'package:flutter_test/flutter_test.dart'; void main() { setUpAll(() { mockSvgPicture(); // 启用SvgPicture测试占位,不会真实加载资源 }); testWidgets( 'SvgPicture.asset passes', (WidgetTester tester) async { await tester.pumpWidget(MaterialApp( home: Scaffold( body: SvgPicture.asset('icons/pencil.svg'), ), )); await tester.pump(); // 可正常验证组件存在 expect(find.byType(SvgPicture), findsOneWidget); }, ); }
方案2:加载真实测试资源(适合需要验证svg渲染内容的场景)
如果你需要在测试中真实渲染svg内容做截图对比等操作,可以按以下步骤操作:
- 新建
test/assets/icons/目录,把pencil.svg文件放入该目录 - 调整测试代码手动加载资源:
import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets( 'SvgPicture.asset passes', (WidgetTester tester) async { // 手动加载测试目录下的svg资源 final svgBytes = await rootBundle.load('test/assets/icons/pencil.svg'); await tester.runAsync(() async { await tester.pumpWidget(MaterialApp( home: Scaffold( // 用内存字节加载svg,避免asset路径解析问题 body: SvgPicture.memory(svgBytes.buffer.asUint8List()), ), )); await tester.pump(); expect(find.byType(SvgPicture), findsOneWidget); }); }, ); }
注意:该方案不需要把测试资源加到
pubspec.yaml的生产assets列表中,不会额外增大生产包体积。
内容的提问来源于stack exchange,提问作者Andrey Gritsay
相关产品推荐
相关产品推荐

