flutter - 小部件测试期间无法加载 Assets SVG

标签 flutter unit-testing testing svg

我想在我的一些屏幕上做一个小部件测试,其中包括 SvgPicture 小部件,但我不能这样做,因为它会抛出异常。

重现错误的代码:

import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:flutter_test/flutter_test.dart';


void main() {
  testWidgets(
    'SvgPicture.asset passes',
    (WidgetTester tester) async {
      await tester.pumpWidget(MaterialApp(
        home: Scaffold(
          body: SvgPicture.asset('icons/pencil.svg'),
        ),
      ));
      await tester.pump();
    },
  );
}

执行结果:

══╡ EXCEPTION CAUGHT BY SVG ╞═══════════════════════════════════════════════════════════════════════
The following assertion was thrown resolving a single-frame picture stream:
Unable to load asset: icons/pencil.svg

When the exception was thrown, this was the stack:
#0      PlatformAssetBundle.load (package:flutter/src/services/asset_bundle.dart:224:7)
<asynchronous suspension>
<asynchronous suspension>
(elided one frame from package:stack_trace)
...

Picture provider: ExactAssetPicture(name: "icons/pencil.svg", bundle: null, colorFilter: null)
Picture key: AssetBundlePictureKey(bundle: PlatformAssetBundle#c2c00(), name: "icons/pencil.svg",
  colorFilter: null)
════════════════════════════════════════════════════════════════════════════════════════════════════

如何通过考试?

最佳答案

只需创建假的 AssetBundle 并用它包装整个应用程序:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_svg/svg.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';

class FakeAssetBundle extends Fake implements AssetBundle {
  final String svgStr = '''<svg viewBox="0 0 10 10"></svg>''';

  @override
  Future<String> loadString(String key, {bool cache = true}) async => svgStr;
}

void main() {
  testWidgets(
    'SvgPicture.asset passes',
    (WidgetTester tester) async {
      await tester.pumpWidget(DefaultAssetBundle(
        bundle: FakeAssetBundle(),
        child: MaterialApp(
          home: Scaffold(
            body: SvgPicture.asset('icons/pencil.svg'),
          ),
        ),
      ));
      await tester.pump();
    },
  );
}

关于flutter - 小部件测试期间无法加载 Assets SVG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68653117/

相关文章:

xcode_backend.sh : no such file or directory. 我需要创建这个文件吗?

flutter - 分页gridview失败

scala - 嵌入式ES实例在运​​行单元测试时失败

ruby-on-rails - Rails - 测试模型和应用程序模型有什么区别?

api - 测试调用相同私有(private)方法的多个公共(public)方法

json - 解析 Flutter 中的对象列表错误

firebase - 如果电子邮件和密码在 firebase flutter 中无效,如何显示错误消息?

java - 使用JUnit查询数据库的测试方法

spring - 如何在 SpringBootTest 中的 @DataJpaTest 中导入配置类?

unit-testing - 如何在 Jest moduleNameMapper 中正确创建正则表达式