You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter SharedPreferences含点键名导致测试用例失败的解决办法

解决SharedPreferences带点键名的测试迁移失败问题

问题背景

需要将SharedPreferences中键为flutter.savedName的名称列表迁移到models键下,业务代码逻辑正常,但测试用例执行失败——仅当把测试中的键名改为savedName时才能通过,而实际生产环境的键名无法修改,问题由键名中的点字符触发。

问题原因

SharedPreferences的测试mock实现(如shared_preferences包自带的mock)对包含点字符的键存在处理逻辑问题:调用setMockInitialValues设置带点键时,mock内部可能自动添加前缀或转义键名,导致后续getStringList无法匹配到对应的键值,迁移逻辑因此不执行。

解决方案

无需修改业务代码,只需调整测试用例的mock方式,直接操作mock实例的内部存储来设置带点键值,绕过setMockInitialValues的限制。

修改后的测试代码

test('Migrate Names', () async {
  // 获取mock实例并直接设置带点键的初始值
  final mockPrefs = await SharedPreferences.getInstance() as SharedPreferencesMock;
  mockPrefs.setStringList("flutter.savedName", ["Nokia", "Pixel"]);
  
  await handler.migratePreviousName();
  await handler.addNames(["iPhone", "Samsung"]);
  final list = await handler.getAllNames();
  expect(list.length, 4);
});

补充说明

  • 生产环境中SharedPreferences对带点的键名支持正常,业务代码无需改动;
  • 若你的测试依赖的mock类不是SharedPreferencesMock,可查看对应mock库的文档,找到直接操作内部存储的方式(比如部分库暴露store属性,可直接赋值mockPrefs.store["flutter.savedName"] = ["Nokia", "Pixel"])。

内容的提问来源于stack exchange,提问作者Nassif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:00:29