在键名中使用点字符的问题 flutter 共享首选项失败测试用例

问题描述 投票:0回答:1

我正在将名称列表保存到 flutter 中的共享首选项中,场景是以前应用程序在键“flutter.savedName”下保存名称列表,但请求已更改为获取“flutter”下所有以前保存的名称.savedName”并保存在“models”键下,以下是代码

  Future<void> migratePreviousName() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    List<String> namelist = prefs.getStringList("flutter.savedName") ?? [];
    if (namelist.isNotEmpty) {
      prefs.remove("flutter.savedName");
      await addNames(namelist);
    }
  }

  Future<void> addNames(List<String> models) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    List<String>? namelist = (await getAllNames() as List<String>?) ?? [];
    namelist.addAll(models);
    prefs.setStringList("models", namelist.toList());
  }

  Future<List<String>> getAllNames() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.getStringList("models") ?? [];
  }

以下是测试用例,

   test(
      'Migrate Names',
      () async {
        SharedPreferences.setMockInitialValues({
          "flutter.savedName": ["Nokia", "Pixel"].toList()
        });
        await handler.migratePreviousName();
        await handler.addNames(["iPhone", "Samsung"]);
        final list = await handler.getAllNames();
        expect(list.length, 4);
      },
    );

测试用例失败,但是如果我将键名从 "flutter.savedName" 更改为 "savedName",测试用例就会通过。由于密钥已存在,我需要使用“flutter.savedName”,了解这是由于密钥名称中的点造成的。有解决办法吗

flutter dart unit-testing sharedpreferences
1个回答
0
投票

我认为您错过了等待设置该列表的时间:

prefs.setStringList("models", namelist.toList()); 

修复

await prefs.setStringList("models", namelist.toList());

等待获取该异步操作的完成结果。

希望对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.