You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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内容做截图对比等操作,可以按以下步骤操作:

  1. 新建test/assets/icons/目录,把pencil.svg文件放入该目录
  2. 调整测试代码手动加载资源:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 17:18:00