dart Flutter:测试共享偏好

brc7rcf0  于 2023-09-28  发布在  Flutter
关注(0)|答案(4)|浏览(104)

我正在测试这个函数:

void store(String x, String y) async {
    Map<String, dynamic> map = {
      'x': x,
      'y': y,
    };
    var jsonString = json.encode(map);
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setString('fileName', jsonString);
  }

我看到我可以使用以下项填充共享首选项

const MethodChannel('plugins.flutter.io/shared_preferences')
  .setMockMethodCallHandler((MethodCall methodCall) async {
    if (methodCall.method == 'getAll') {
      return <String, dynamic>{}; // set initial values here if desired
    }
    return null;
  });

但我不知道如何使用,尤其是在我的情况下。

7vux5j2d

7vux5j2d1#

您可以使用SharedPreferences.setMockInitialValues进行测试

test('Can Create Preferences', () async{

    SharedPreferences.setMockInitialValues({}); //set values here
    SharedPreferences pref = await SharedPreferences.getInstance();
    bool working = false;
    String name = 'john';
    pref.setBool('working', working);
    pref.setString('name', name);

    expect(pref.getBool('working'), false);
    expect(pref.getString('name'), 'john');
  });
wz1wpwve

wz1wpwve2#

感谢nonybrighto提供的有用答案。
我在尝试使用以下命令在共享首选项中设置初始值时遇到了麻烦:

SharedPreferences.setMockInitialValues({
  "key": "value"
});

shared_preferences插件似乎希望key具有前缀flutter.。因此,如果使用上述方法进行模拟,则需要添加到您自己的密钥中。
第20章为了证明这点:https://github.com/flutter/plugins/blob/2ea4bc8f8b5ae652f02e3db91b4b0adbdd499357/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart

mlnl4t2r

mlnl4t2r3#

我不知道这是否对你有帮助,但在找到这个解决方案之前,我也浪费了很多时间

LocalDataSourceImp.test.dart

void main(){
  SharedPreferences? preference;
  LocalDataSourceImp? localStorage ;

setUp(() async{
  preference =  await SharedPreferences.getInstance();
  localStorage = LocalDataSourceImp(preference!);
  SharedPreferences.setMockInitialValues({});
});

final token = TokenModel(data: "babakoto");

test("cache Token ", ()async{
  localStorage!.cacheToken(token);
  final result = preference!.getString(TOKEN);
  expect(result, json.encode(token.toJson()));
});
}

LocalDataSourceImp.dart

class LocalDataSourceImp implements LocalDataSource{

  SharedPreferences pref ;

  LocalDataSourceImp(this.pref);

  @override
  Future<void> cacheToken(TokenModel token)async {
    await pref.setString(TOKEN,json.encode(token));
  }

}
yquaqz18

yquaqz184#

在main函数中添加这个TestWidgetsFlutterBinding.ensureInitialized();,为我解决了

相关问题