【问题标题】:Flutter: testing shared preferencesFlutter:测试共享偏好
【发布时间】:2019-03-18 12:32:39
【问题描述】:

我正在尝试测试这个功能:

 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;
  });

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

【问题讨论】:

    标签: unit-testing testing dart flutter


    【解决方案1】:

    您可以使用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');
      });
    

    【讨论】:

    • 我在尝试测试 shared_preferences 时不断出错。是不是因为我在运行flutter test 而没有使用设备进行测试?
    • 没有。您应该能够在颤振测试中使用它。你得到什么样的错误?
    • 我已经处理好了,但我不记得是什么问题了。谢谢!
    • 如果我使用verify(pref.setString(any, any)).called(),我有一个错误:“用于非模拟对象”
    • 是的。它不适用于模拟。 mockito 需要一个像 class MockSharedPreference extends Mock implements SharedPreferences{} 这样扩展 Mock 的对象。我真的不知道如何完成这项工作。
    【解决方案2】:

    感谢 nonybrighto 提供的有用答案。

    我在尝试使用以下方法在共享首选项中设置初始值时遇到了麻烦:

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

    shared_preferences 插件似乎希望键具有前缀flutter.。因此,如果使用上述方法进行模拟,则需要添加到您自己的密钥中。

    有关这方面的证据,请参见此处的第 20 行: https://github.com/flutter/plugins/blob/2ea4bc8f8b5ae652f02e3db91b4b0adbdd499357/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart

    【讨论】:

    • 上面的链接坏了
    • 感谢@SimonH - 更新了指向新文件位置的链接。
    • 它不是必需的。它会自动为密钥添加前缀:github.com/flutter/plugins/blob/…
    • @HashemAboonajmi 是对的,您的答案不适用于您链接的修订版(也不适用于最近的修订版)
    【解决方案3】:

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

    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));
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-20
      • 2019-03-06
      • 2021-10-11
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多