Testing 颤振:如何加载测试文件

Testing 颤振:如何加载测试文件,testing,intellij-idea,readfile,flutter,Testing,Intellij Idea,Readfile,Flutter,文件可以从相对于dart脚本文件的目录中读取,简单地说就是var File=new File('./fixture/contacts.json') 但是,在IDE中运行的颤振测试无法读取该文件 (不是,因为我不想在应用程序中捆绑测试数据文件)在测试中也不起作用 在flatter中读取文件的好方法是什么(对于命令行测试和IDE测试) 运行颤振测试非常快。然而,IntellijIDE内部的测试速度非常慢,但它可以设置调试断点并单步执行和查看变量。所以这两种测试都非常有用。刚刚尝试了一下,比您预期的要

文件可以从相对于dart脚本文件的目录中读取,简单地说就是
var File=new File('./fixture/contacts.json')

但是,在IDE中运行的颤振测试无法读取该文件

(不是,因为我不想在应用程序中捆绑测试数据文件)在测试中也不起作用

在flatter中读取文件的好方法是什么(对于命令行测试和IDE测试)


运行
颤振测试
非常快。然而,IntellijIDE内部的测试速度非常慢,但它可以设置调试断点并单步执行和查看变量。所以这两种测试都非常有用。

刚刚尝试了一下,比您预期的要容易

首先,创建一个与测试所在目录相同的文件夹。例如,我创建了一个名为test\u resources的文件夹

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

测试资源/contacts.json

{
  "contacts": [
    {
      "id": 1,
      "name": "Seth Ladd"
    },
    {
      "id": 2,
      "name": "Eric Seidel"
    }
  ]
}
测试/加载文件\u测试.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');
  });
}

您可以使用DefaultAssetBundle


final response=DefaultAssetBundle.of(context.loadString('assets/file_name.json')

我今天遇到了同样的问题。我的测试在IDE(Android Studio)中通过,但在CI上失败。我发现IDE需要一个非相对路径,但是
flattertest
需要一个相对路径。我认为这是一个错误,我将寻找正确的地方报告它。然而,在此期间,我发现了一个粗糙的工作。基本上,我有一个函数,它尝试两种方法来指定文件路径

导入'dart:convert';
导入“dart:io”;
未来parseRawSample(字符串文件路径,
[bool relative=true])异步{
filePath=relative?“测试数据/src/samples/raw/$filePath”:filePath;
字符串jsonString;
试一试{
jsonString=等待文件(filePath).readAsString();
}捕获(e){
jsonString=await File(“../”+filePath).readAsString();
}
返回json.decode(jsonString);
}

大部分代码都是针对我的情况编写的,但我认为其他人可能会根据自己的目的修改这项工作。

我创建了一个util,因为vscode和命令行测试基路径是不同的

这就是我使用它的方式


另一种方法是在命令行中指定精确的测试路径

$ flutter test test

您可以将测试文件放在两个地方(我知道在两个地方有相同的数据不是一个好的做法)。假设我想在测试代码中打开data.json文件,使用
final file=file(dataFilename)
,那么dataFilename将是“test\u resources/data.json”。若测试是从Android Studio执行的,则测试资源是项目根目录中的一个文件夹。如果从命令行执行测试,则测试资源是测试文件夹中的一个文件夹。因此,将文件放在两个位置将解决问题。

只需从以下位置复制解决方案:


很好

当前目录始终是Flatter 2.0中的项目根目录DefaultAssetBundle未为我定义:/n运行
Flatter test时,它只是我还是此结构不工作?但在IDE中工作。有人准备同时使用命令行和IDE吗?@IkarPohorský看看Grahambo的答案。我和你们有类似的问题,他的回答为我解决了。我更喜欢在测试目录中创建资源目录。通过这种方式,我可以使用以下路径获取资源文件test/resources/contacts.json,并且我可以将所有测试文件保存在test中。尝试运行
flattertest
。不需要相对路径。我也有同样的问题,对我来说,它适用于
颤振测试
String fixture(String name) {
   var dir = Directory.current.path;
   if (dir.endsWith('/test')) {
     dir = dir.replaceAll('/test', '');
   }
   return File('$dir/test/fixtures/$name').readAsStringSync();
}