Flutter - 加载资产进行测试

Posted

技术标签:

【中文标题】Flutter - 加载资产进行测试【英文标题】:Flutter - Load assets for tests 【发布时间】:2018-09-03 22:13:36 【问题描述】:

不确定是限制还是什么,但下面的代码没有加载任何东西。我有一些数据驱动的行为,我想单独测试。

类加载器

import 'dart:async';
import 'package:flutter/services.dart' show rootBundle;

class Loader 
  Future<String> load() async
    return await rootBundle.loadString('assets/json/sketch.json');
  

测试

testWidgets('Should parse load sketch.json', (WidgetTester tester) async 
    var loaderFuture = new Loader();

    Future<String> resultFuture = loaderFuture.load();

    resultFuture.then((value) => print(value))
        .catchError((error) => print(error));

    while(true);
  );

Future 既不返回成功也不返回错误,并且永远挂起。我知道 while(true) 锁定了测试,但现在我只想看看 sketch.json 打印出来

资产位置

【问题讨论】:

你能试试rootBundle.loadString('packages/my_app/assets/json/sketch.json');,其中my_app 来自pubspec.yaml 中的name: ... 同样的结果。没有任何东西被打印出来。 name: flutter_generator_demo 路径类似于 return await rootBundle.loadString('packages/flutter_generator_demo/assets/json/sketch.json'); 。重要的是我可以在运行应用程序时加载它 我认为这已经解决了。可以试试最近的devmaster吗? 【参考方案1】:

要在测试中使用rootBundle,您需要在测试程序开始时使用它:

import 'package:flutter_test/flutter_test.dart';

...
void main() 
  TestWidgetsFlutterBinding.ensureInitialized();

【讨论】:

谢谢,将WidgetsFlutterBinding.ensureInitialized(); 替换为TestWidgetsFlutterBinding.ensureInitialized(); 确实有效!【参考方案2】:

请参阅DefaultAssetBundle 的文档,它描述了使用它和 AssetBundle 来提供您自己的资产。

【讨论】:

@Simon - 测试小部件以外的东西怎么样,我有一个 API 类需要从资产文件夹加载 JSON 文件,它在测试环境中不起作用。 @Unnikrishnan 使用 rootBundle.loadString('') 将 json 数据读取为字符串并进行相应的映射。 @RajYadav 您能否详细说明我如何为我的测试定义资产,而不是为使用我的包的应用程序定义资产? 链接已损坏 :(

以上是关于Flutter - 加载资产进行测试的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:无法加载资产文件“car.png”

Flutter:未处理的异常:无法加载资产

如何将 JSON 资产加载到 Flutter 应用程序中?

Flutter 无法在物理设备上加载图像资产(但在模拟器上加载它就好了)

如何让 Flutter 的 webview 处理从本地 html 加载的本地资产?

Flutter web:一些png资产未加载(404)状态