Flutter:如何加载文件进行测试

j8yoct9x  于 2023-02-16  发布在  Flutter
关注(0)|答案(9)|浏览(181)

文件可以从dart脚本文件的相对目录中读取,简单地称为var file = new File('./fixture/contacts.json')
但是,IDE内部运行的Flutter测试无法读取该文件。
Loading as resource(它不是,因为我不想在应用程序中捆绑测试数据文件)在测试中也不起作用。
在flutter中读取文件的好方法是什么(对于命令行测试和IDE测试)?
运行flutter test非常快。但是在Intellij IDE内部测试非常慢,但是它可以设置调试断点,并单步执行和查看变量。所以这两种测试都非常有用。

qcbq4gxm

qcbq4gxm1#

我刚试了一下,比你想象的要容易。
首先,创建一个与测试所在目录相同的文件夹,例如,我创建了一个名为test_resources的文件夹。

然后,假设我们有以下JSON文件用于测试。

测试资源/联系人.json

{
  "contacts": [
    {
      "id": 1,
      "name": "Seth Ladd"
    },
    {
      "id": 2,
      "name": "Eric Seidel"
    }
  ]
}

测试/加载文件测试.dart

我们可以这样用它来做测试:

import 'dart:convert';
import 'dart:io';
import 'package:flutter_test/flutter_test.dart';

void main() {
  test('Load a file', () async {
    final file = new File('test_resources/contacts.json');
    final json = jsonDecode(await file.readAsString());
    final contacts = json['contacts'];

    final seth = contacts.first;
    expect(seth['id'], 1);
    expect(seth['name'], 'Seth Ladd');

    final eric = contacts.last;
    expect(eric['id'], 2);
    expect(eric['name'], 'Eric Seidel');
  });
}
jexiocij

jexiocij2#

我今天遇到了同样的问题。我的测试在IDE(Android Studio)中通过,但在CI上失败。我发现IDE需要非相对路径,而flutter test需要相对路径。我认为这是一个错误,我将寻找正确的位置报告它。然而,我发现了一个粗略的解决方案。基本上,我有一个函数,它尝试两种方式来指定文件路径。

import 'dart:convert';
import 'dart:io';

Future<Map<String, dynamic>> parseRawSample(String filePath,
    [bool relative = true]) async {
  filePath = relative ? "test_data/src/samples/raw/$filePath" : filePath;

  String jsonString;
  try {
    jsonString = await File(filePath).readAsString();
  } catch (e) {
    jsonString = await File("../" + filePath).readAsString();
  }
  return json.decode(jsonString);
}

大部分代码是针对我的情况的,但我认为其他人可能会根据他们的目的修改这个工作。

qojgxg4l

qojgxg4l3#

我创建了一个实用程序,因为vscode和命令行测试基本路径不同
https://github.com/terryx/flutter-muscle/blob/master/github_provider/test/utils/test_path.dart
我就是这么用的
https://github.com/terryx/flutter-muscle/blob/master/github_provider/test/services/github_test.dart#L13
另一种方法是在命令行中指定确切的测试路径

$ flutter test test
js4nwp54

js4nwp544#

在Flutter 2.0中,当前目录始终是项目根目录🎉,因此您现在可以在命令行和IDE中使用相同的代码读取文件。
https://github.com/flutter/flutter/pull/74622

xggvc2p6

xggvc2p65#

一个简单的解决办法是

import 'dart:io';

String fixture(String name) => File('test/fixtures/$name').readAsStringSync();

test文件夹与lib文件夹处于同一级别,您可以按如下方式访问夹具:String fileContent = fixture('contacts.json')
之后,通常将fileContent转换为Map对象,其中jsonDecode来自dart:convert,然后将此转换后的对象Map到通常具有myModel.fromJson(Map onvertedJson)方法的所需模型。
您可以使用json to dart android studio plugin或在线转换工具(如this online JSON converter)从JSON响应生成模型

5anewei6

5anewei66#

您可以将测试文件放在两个位置(我知道在两个地方使用相同的数据不是一个好习惯)。假设我希望在使用final file = File(dataFilename)测试的代码中打开data.json文件,则dataFilename将为“test_resources/data.json”。如果从Android Studio执行测试,test_resources是项目根目录下的一个文件夹。如果从命令行执行测试,则test_resources是test文件夹下的一个文件夹。因此,将文件放在这两个位置将解决问题。

wecizke3

wecizke37#

仅从Flocbit复制解决方案:https://github.com/flutter/flutter/issues/20907#issuecomment-557634184

String fixture(String name) {
   var dir = Directory.current.path;
   if (dir.endsWith('/test')) {
     dir = dir.replaceAll('/test', '');
   }
   return File('$dir/test/fixtures/$name').readAsStringSync();
}

效果很好!

eimct9ow

eimct9ow8#

只需使用Directory.current.path,您就可以轻松使用:

import 'dart:io';

// Set the absolute path for your file
final path = '${Directory.current.path}/test/example.json'; 
final json = await File(path).readAsString();
ujv3wf0j

ujv3wf0j9#

您可以使用**DefaultAssetBundle**,
最终响应=默认资产捆绑包.of(上下文).loadString(“资产/文件名. json”);

相关问题