私は、テスト主導の方法でiOSアプリを作成することに積極的に取り組んでいます。しかし、実際のシステムファイルとやり取りするメソッドをテストする方法に困惑しています。 iOSに慣れている方のために、NSUserDefaults
ファイルに書き込みます。
これが私のセットアップです。インターネットからダウンロードしたデータがローカルで最後に同期されたときに記録するために使用しているAppState
というシングルトンがあります。他のクラスは、dateLastSynced
のAppState
プロパティを更新できます。 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
に既にシステムに保存されているデータを上書きせずにそれを行う方法がわかりません。
モックまたはエミュレートする必要があり、そのための2つの非常に正当な理由があります。
次の理由により、コードが相互作用するシステムのどの部分もモックまたはエミュレートする必要があります。
テストがシステムのように制御できないものに依存することを望まないでしょう。
はい、エミュレーションは完璧ではありません。はい、実際には、システムがどのように機能するかについての知識と仮定をモデル化します。そしてそれは完全に素晴らしいです。あなたは本質的にスペックを取り、それをコードで言い換えています:それで何も悪いことではありません。この場合の仕様は、オペレーティングシステムの作成者が作成したものであり、ユーザーが作成したものではありません。
あなたは自分のものも含め、時間を扱うすべてのものを模倣またはエミュレートする必要があります。