web-dev-qa-db-ja.com

システムファイルのデータを操作するメソッドのテストをどのように記述しますか?

私は、テスト主導の方法でiOSアプリを作成することに積極的に取り組んでいます。しかし、実際のシステムファイルとやり取りするメソッドをテストする方法に困惑しています。 iOSに慣れている方のために、NSUserDefaultsファイルに書き込みます。

これが私のセットアップです。インターネットからダウンロードしたデータがローカルで最後に同期されたときに記録するために使用しているAppStateというシングルトンがあります。他のクラスは、dateLastSyncedAppStateプロパティを更新できます。 setDateLastSyncedメソッドをオーバーライドして、その更新をシステムに保存し、アプリを開いてから閉じるまで保持されるようにします。

- (void)setDateLastSynced:(NSDate *)dateLastSynced
{
    // update instance variable with new value
    _dateLastSynced = dateLastSynced;

    // store change to NSUserDefaults
    [[NSUserDefaults standardUserDefaults] setObject:dateLastSynced forKey:APP_STATE_DATE_LAST_SYNCED_KEY];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

setDateLastSyncedが正常に動作していることを確認するテストを作成したいのですが、NSUserDefaultsに既にシステムに保存されているデータを上書きせずにそれを行う方法がわかりません。

6
H K

モックまたはエミュレートする必要があり、そのための2つの非常に正当な理由があります。

  1. 次の理由により、コードが相互作用するシステムのどの部分もモックまたはエミュレートする必要があります。

    • システムを変更したくない、そして
    • テストがシステムのように制御できないものに依存することを望まないでしょう。

      はい、エミュレーションは完璧ではありません。はい、実際には、システムがどのように機能するかについての知識と仮定をモデル化します。そしてそれは完全に素晴らしいです。あなたは本質的にスペックを取り、それをコードで言い換えています:それで何も悪いことではありません。この場合の仕様は、オペレーティングシステムの作成者が作成したものであり、ユーザーが作成したものではありません。

  2. あなたは自分のものも含め、時間を扱うすべてのものを模倣またはエミュレートする必要があります。

    • エミュレートされたクロック時間を特定の偽の日付に設定し、ファイルが作成/変更されたふりをして、その作成/変更の日付を確認し、それが偽の日付であることを確認する必要があります。もちろん、これらはすべて、システムクロック。
    • また、単一のテストの実行中に、将来の特定の日付が正しく設定されていること、またはその瞬間に何かが発生することを、リアルタイムで進むのを待たずに確認できる必要もあります。
5
Mike Nakis