私は最初の iOS 単体テスト (Xcode 5、iOS 6) を書いていますが、最近シミュレーターで行ったことによって単体テストの結果が異なることがわかりました。たとえば、シミュレーターの連絡先リストでユーザーをクリックすると、単体テストを実行している場合でも、UserDefaults の「最近の連絡先」データに以前よりも 1 つ多くのオブジェクトが含まれるようになりました。
単体テストの場合、ランダムなユーザー デフォルト データを使用するのはクリーンではありません (私は独自のクリーン データベースを使用した RoR テストに慣れています)。その上、空の「最近の連絡先」データを持つなど、特定の状態をテストしたい場合があります。
ここで関連する質問を見ると、私が満足していない可能性のある答えがいくつかあるようです。
- 単体テスト用に UserDefaults をモックしてください。そのモックを注入できるようにするには、多くの既存のクラスを変更する必要があります。
- setUp メソッドで UserDefaults をクリアまたはカスタマイズしてください。しかし、手動テストで苦労して作成したデータはなくなってしまいます。
- setUp メソッドで UserDefaults をクリアまたはカスタマイズしてから、tearDown でそれらの値を復元します。ああ。
これらは、単体テストの標準的な方法であるはずのものに対して、不必要に複雑に思えます。すべての単体テストで自分自身を繰り返したくありません。だから、私の質問は次のとおりです。
- アドホック シミュレーター テストから単体テストの実行まで、UserDefaults が永続化される方法について何か望ましいことがありませんか?
- これを修正する構成可能な方法はありますか? たとえば、単体テストのターゲットを設定して、シミュレーターを使用して手動でテストする場合とは異なる UserDefaults の保存場所を設定する方法はありますか?
- それができない場合、コードでこれを行うエレガントな方法はありますか?
- たとえば、MyAppTestCase オブジェクトを XCTestCase から継承させ、setUp メソッドと tearDown メソッドをオーバーライドして、常に脇に置いてから UserDefaults を復元することができます。これは良い考えですか?