web-dev-qa-db-ja.com

Flutter:テスト用にファイルをロードする方法

ファイルは、var file = new File('./fixture/contacts.json')のように、Dartスクリプトファイルに関連するディレクトリから読み取ることができます。

ただし、IDE内で実行されているフラッターテストでファイルを読み取ることはできません。

リソースとしてロード (アプリにテストデータファイルをバンドルしたくないので、そうではありません)もテストで機能しません。

フラッターでファイルを読み取る良い方法は何ですか(コマンドラインテストとIDEテストの両方))?

ランニング flutter testは非常に高速です。ただし、Intellij IDE内でのテストは非常に遅いですが、デバッグブレークポイントを設定し、変数にステップインして表示することができます。したがって、両方のテストは非常に便利です。

15
Kyaw Tun

これを試してみたところ、予想よりも簡単です。

まず、テストと同じディレクトリにあるフォルダを作成します。たとえば、test_resourcesというフォルダーを作成しました。

Test resources folder structure.

次に、テスト用に次のJSONファイルがあるとします。

test_resources/details.json

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

test/load_file_test.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 = json.decode(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');
  });
}
12
Iiro Krankka

今日、これと同じ問題が発生しました。私のテストは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);
}

そのコードの多くは私の状況に固有のものですが、他の人はおそらくこの回避策を自分の目的に適合させることができると思います。

3
Grahambo

vscodeとコマンドラインテストのベースパスが異なるため、utilを作成しました

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#L1


別の方法は、コマンドラインで正確なテストパスを指定することです

$ flutter test test
1
Terry

DefaultAssetBundle、を使用できます

最終応答= DefaultAssetBundle.of(context).loadString( 'assets/file_name.json');

0
Vinoth Kumar