Flutter 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
相关产品推荐
相关产品推荐

