1. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

[Flutter] error writing flutter unit tests for an sqlite database api

Discussão em 'Mobile' iniciado por Stack, Outubro 1, 2024 às 10:32.

  1. Stack

    Stack Membro Participativo

    I'm trying to write a test file for my flutter database api. I have a prepopulated database on wich i want to execute my tests that is stored in assets/database/ and is named database.db.

    pubspec.yaml:

    dev_dependencies:
    flutter_lints: ^4.0.0
    flutter_launcher_icons: ^0.13.1
    flutter_test:
    sdk: flutter
    sqflite_common_ffi: ^2.3.3

    flutter:
    uses-material-design: true
    generate: true
    assets:
    - assets/images/
    - assets/database/


    database_api.dart:

    import 'dart:io';
    import 'package:flutter/services.dart';
    import 'package:path/path.dart';
    import 'package:sqflite/sqflite.dart';

    class DatabaseAPI {
    static final DatabaseAPI _instance = DatabaseAPI._internal();
    static Database? _db;
    final String _dbName = "database.db";

    DatabaseAPI._internal();

    factory DatabaseAPI() {
    return _instance;
    }

    Future<Database?> get db async {
    if (_db != null) {
    return _db;
    } else {
    _db = await _initDB();
    return _db;
    }
    }

    Future<Database> _initDB() async {
    final path = join(await getDatabasesPath(), _dbName);
    final exist = await databaseExists(path);
    if(!exist) {
    try {
    ByteData data = await rootBundle.load(join('assets', 'database', _dbName));
    List<int> bytes = data.buffer.asUint8List();
    await File(path).writeAsBytes(bytes);
    } catch (error) {
    throw Exception('Error copying database: $error');
    }
    }
    return await openDatabase(path);
    }

    Future<String> fetchLanguage() async {
    var dbClient = await db;
    final List<Map<String, Object?>> list = await dbClient!.query('language');
    var lang = list[0]['selected'];
    return lang.toString();
    }
    }


    This is how i write my test file

    database_api_test.dart:

    import 'package:flutter_test/flutter_test.dart';
    import 'package:drinking_game/db_api/database_api.dart';
    import 'package:sqflite_common_ffi/sqflite_ffi.dart';

    void main() {
    TestWidgetsFlutterBinding.ensureInitialized();
    databaseFactory = databaseFactoryFfi;

    test('fetchLanguage returns correct data', () async {
    var api = DatabaseAPI();
    var lang = await api.fetchLanguage();
    print(lang);
    expect(lang, "Italiano");
    });
    }


    The error that is generated is:

    Exception: Error copying database: Unable to load asset: "assets\database\database.db".
    The asset does not exist or has empty data.
    package:drinking_game/db_api/new_database_api.dart 49:9 DatabaseAPI._initDB


    But this error arise just when i run the test, when i do a normal build i have no error. How can i solve this?

    Continue reading...

Compartilhe esta Página