【问题标题】:Unable to load assets in flutter tests无法在颤振测试中加载资产
【发布时间】:2020-03-13 13:53:41
【问题描述】:

rootBundle 在应用程序中运行良好,但在测试中它会抛出异常 ERROR: Unable to load asset: assets/config/prod.json

配置.dart

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

class Configuration {

  final Map<String, String> _config = {};

  String get(String key) {
    return _config[key];
  }

  Future<void> load() async {
    _config.clear();
    final configString = await rootBundle.loadString('assets/config/prod.json');
    final configJson = jsonDecode(configString) as Map<String, dynamic>;
    _config.addAll(Map.castFrom<String, dynamic, String, String>(configJson));
  }

}

configuration_test.dart

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:my_app/data/models/configuration.dart';

void main() {

  setUpAll(() {
    WidgetsFlutterBinding.ensureInitialized();
  });

  test('should load configuration', () async {
    final config = Configuration();
    await config.load();
    expect(config.get('client_id'), 'client_id');
  });

}

pubspec.yaml

...
dev_dependencies:
  ...
  flutter_test:
    sdk: flutter

flutter:
  assets:
    - assets/config/
...

我做错了什么?

【问题讨论】:

    标签: unit-testing flutter assets


    【解决方案1】:

    我发现我的测试出了什么问题。 TestWidgetsFlutterBindingflutter_test 包中有TestWidgetsFlutterBinding,我应该使用它而不是material 包中的WidgetsFlutterBinding

    configuration_test.dart

    import 'package:flutter_test/flutter_test.dart';
    import 'package:my_app/data/models/configuration.dart';
    
    void main() {
    
      setUpAll(() {
        TestWidgetsFlutterBinding.ensureInitialized();
      });
    
      test('should load configuration', () async {
        final config = Configuration();
        await config.load();
        expect(config.get('client_id'), 'client_id');
      });
    
    }
    

    【讨论】:

      【解决方案2】:

      万一遇到when building a flutter package这个问题,要知道pubspec.yaml默认情况下flutter属性设置为null(flutter: null),资产的缩进是错误的。

      因此,您首先需要将flutter 属性设置为空,如下所示:
      flutter:

      然后确保资产缩进如下:

      [2 whitespaces or 1 tab]assets:
      
      [4 whitespaces or 2 tabs]- assets/image1.png
      
      [4 whitespaces or 2 tabs]- assets/image2.png
      

      【讨论】:

        【解决方案3】:

        如果你在puspec.yaml 文件中定义JSON 文件,你必须写下你的json 文件的全名,如下所示

        assets:
          - assets/data.json
        

        在你的情况下,路径将是

        assets:
          - assets/config/prod.json
        

        【讨论】:

        • 仍在应用程序中工作,但在测试中抛出异常
        猜你喜欢
        • 1970-01-01
        • 2021-01-08
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2022-08-10
        • 1970-01-01
        • 2020-12-08
        • 2021-02-27
        相关资源
        最近更新 更多