ぽぴなび

知って感動した技術情報・生活情報や買ってよかったものの雑記です。

【Flutter】shared_preferencesのsetMockInitialValuesが最初の1度しか適用されない

例えば以下のように各テストでSharedPreferencesに異なる初期値を設定したい場合、最初に実行したsetMockInitialValues以外は無視されるっぽい。 以下の例では(おそらく){ 'test': 0 }が有効になり{ 'test': 1 }は反映されない。

void main() {
  setUp((){
    SharedPreferences.setMockInitialValues({
      'test': 0,
    });
  });

  group('test1', (){
    setUp((){
      SharedPreferences.setMockInitialValues({
        'test': 1,
      });
    });
    testWidget('test1-1', (tester) async { /* ~~ */ });
  });
}

pub.dev

一応setMockInitialValuesの説明にも記載されいている?

If the singleton instance has been initialized already, it is nullified.
シングルトンインスタンスがすでに初期化されている場合、それは無効になります。

対処法

github.com

テストごとにSharedPreferencesの内容を変えたい場合は、setMockInitialValuesは使わずに普通にSharedPreferences.setString()などを使ってMock化しないほうが良さそう。